国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

bzoj3672 [Noi2014]購票

2019-11-08 03:16:15
字體:
來源:轉載
供稿:網友

Description

 今年夏天,NOI在SZ市迎來了她30周歲的生日。來自全國 n 個城市的OIer們都會從各地出發(fā),到SZ市參加這次盛會。       全國的城市構成了一棵以SZ市為根的有根樹,每個城市與它的父親用道路連接。為了方便起見,我們將全國的 n 個城市用 1 到 n 的整數編號。其中SZ市的編號為 1。對于除SZ市之外的任意一個城市 v,我們給出了它在這棵樹上的父親城市 fv  以及到父親城市道路的長度 sv。從城市 v 前往SZ市的方法為:選擇城市 v 的一個祖先 a,支付購票的費用,乘坐交通工具到達 a。再選擇城市 a 的一個祖先 b,支付費用并到達 b。以此類推,直至到達SZ市。對于任意一個城市 v,我們會給出一個交通工具的距離限制 lv。對于城市 v 的祖先 a,只有當它們之間所有道路的總長度不超過 lv  時,從城市 v 才可以通過一次購票到達城市 a,否則不能通過一次購票到達。對于每個城市 v,我們還會給出兩個非負整數 pv,qv  作為票價參數。若城市 v 到城市 a 所有道路的總長度為 d,那么從城市 v 到城市 a 購買的票價為 dpv+qv。每個城市的OIer都希望自己到達SZ市時,用于購票的總資金最少。你的任務就是,告訴每個城市的OIer他們所花的最少資金是多少。

Input

第 1 行包含2個非負整數 n,t,分別表示城市的個數和數據類型(其意義將在后面提到)。輸入文件的第 2 到 n 行,每行描述一個除SZ之外的城市。其中第 v 行包含 5 個非負整數 f_v,s_v,p_v,q_v,l_v,分別表示城市 v 的父親城市,它到父親城市道路的長度,票價的兩個參數和距離限制。請注意:輸入不包含編號為 1 的SZ市,第 2 行到第 n 行分別描述的是城市 2 到城市 n。

Output

輸出包含 n-1 行,每行包含一個整數。其中第 v 行表示從城市 v+1 出發(fā),到達SZ市最少的購票費用。同樣請注意:輸出不包含編號為 1 的SZ市。

 

Sample Input

7 31 2 20 0 31 5 10 100 52 4 10 10 102 9 1 100 103 5 20 100 104 4 20 0 10

Sample Output

4015070149300150

HINT

 

對于所有測試數據,保證 0≤pv≤106,0≤qv≤1012,1≤fv<v;保證 0<sv≤lv≤2×1011,且任意城市到SZ市的總路程長度不超過 2×1011

輸入的 t 表示數據類型,0≤t<4,其中:

當 t=0 或 2 時,對輸入的所有城市 v,都有 fv=v-1,即所有城市構成一個以SZ市為終點的鏈;

當 t=0 或 1 時,對輸入的所有城市 v,都有 lv=2×1011,即沒有移動的距離限制,每個城市都能到達它的所有祖先;

當 t=3 時,數據沒有特殊性質。

n=2×10^5

正解:點分治+CDQ分治+斜率優(yōu)化dp。

NOI三合一。。這題首先一看是斜率優(yōu)化,結果是顆樹。。然后我就不會做了,默默地點開題解墮落。。

如果是在序列上,那么就是斜率優(yōu)化+CDQ分治搞一下就行了。我們考慮轉移到樹上該怎么實現。同樣,我們可以在樹上分治,那么為了保證復雜度,我們采用點分治的方法。當我們找到重心以后,我們可以先遞歸深度比重心低的那顆子樹。然后遞歸完成后我們就可以求出重心以上所有結點的狀態(tài)了。然后我們把重心以上的點加入棧中來維護凸線,我們可以倒著加入這樣更加方便。然后再將重心的子樹的狀態(tài)全部算出來取最小值就行了。

//It is made by wfj_2048~#include <algorithm>#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#include <vector>#include <cmath>#include <queue>#include <stack>#include <map>#include <set>#define inf (1LL<<60)#define N (500010)#define eps 1e-9#define il inline#define RG  #define ll long long#define calc(i,j) (dp[j]+p[i]*(dis[i]-dis[j])+q[i])#define getk(i,j) ((double)(dp[i]-dp[j])/(double)(dis[i]-dis[j]))#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)using namespace std;struct edge{ ll nt,to,dis; }g[N];struct node{ ll id,val; }st[N];ll head[N],size[N],fa[N],son[N],dis[N],lim[N],vis[N],que[N],p[N],q[N],dp[N],n,num,cnt;il ll gi(){    RG ll x=0,q=1; RG char ch=getchar(); while ((ch<'0' || ch>'9') && ch!='-') ch=getchar();    if (ch=='-') q=-1,ch=getchar(); while (ch>='0' && ch<='9') x=x*10+ch-48,ch=getchar(); return q*x;}il ll cmp(const node &a,const node &b){ return a.val>b.val; }il void insert(RG ll from,RG ll to,RG ll dis){ g[++num]=(edge){head[from],to,dis},head[from]=num; return; }il void dfs(RG ll x){    size[x]=1; RG ll v;    for (RG ll i=head[x];i;i=g[i].nt){	v=g[i].to,dis[v]=dis[x]+g[i].dis;	dfs(v); size[x]+=size[v];    }    return;}il void getroot(RG ll x,RG ll sz,RG ll &rt){    size[x]=1,son[x]=0; RG ll v;    for (RG ll i=head[x];i;i=g[i].nt){	v=g[i].to; if (vis[v]) continue;	getroot(v,sz,rt); size[x]+=size[v];	son[x]=max(son[x],size[v]);    }    son[x]=max(son[x],sz-size[x]);    if (son[rt]>son[x] && size[x]>1) rt=x; return;}il void getlim(RG ll x){    st[++cnt].id=x,st[cnt].val=dis[x]-lim[x];    for (RG ll i=head[x];i;i=g[i].nt)	if (!vis[g[i].to]) getlim(g[i].to);    return;}il void solve(RG ll x,RG ll sz){    if (sz==1) return; RG ll rt=0; getroot(x,sz,rt);    for (RG ll i=head[rt];i;i=g[i].nt) vis[g[i].to]=1;    solve(x,sz-size[rt]+1); cnt=0;    for (RG ll i=head[rt];i;i=g[i].nt) getlim(g[i].to);    sort(st+1,st+cnt+1,cmp); RG ll now=rt,top=0;    for (RG ll i=1;i<=cnt;++i){	while (now!=fa[x] && st[i].val<=dis[now]){	    while (top>1 && getk(now,que[top])+eps>=getk(que[top],que[top-1])) top--;	    que[++top]=now,now=fa[now];	}	if (top>0){	    RG ll l=1,r=top,mid,pos=1;	    while (l<=r){		mid=(l+r)>>1; if (mid==top){ pos=top; break; }		if (getk(que[mid],que[mid+1])+eps>=p[st[i].id]) pos=mid+1,l=mid+1; else r=mid-1;	    }	    dp[st[i].id]=min(dp[st[i].id],calc(st[i].id,que[pos]));	}    }    for (RG ll i=head[rt];i;i=g[i].nt) solve(g[i].to,size[g[i].to]); return;}il void work(){    n=gi(); RG ll d=gi(); for (RG ll i=2;i<=n;++i) fa[i]=gi(),d=gi(),p[i]=gi(),q[i]=gi(),lim[i]=gi(),insert(fa[i],i,d);    for (RG ll i=2;i<=n;++i) dp[i]=inf; son[0]=n+1,dfs(1),solve(1,n);    for (RG ll i=2;i<=n;++i) PRintf("%lld/n",dp[i]); return;}int main(){    File("ticket");    work();    return 0;}


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 南投县| 小金县| 新宁县| 靖州| 托克托县| 临湘市| 漠河县| 东源县| 永安市| 梧州市| 铁岭县| 日照市| 韶山市| 遂溪县| 资中县| 长沙市| 余干县| 洞口县| 呼图壁县| 壤塘县| 玉树县| 桐梓县| 林西县| 兴山县| 五华县| 城口县| 夹江县| 元阳县| 安康市| 湾仔区| 贺兰县| 沙坪坝区| 西宁市| 陆良县| 谷城县| 墨玉县| 运城市| 石台县| 商水县| 金堂县| 无棣县|