傳送門考慮直接維護乙個堆,然後往裡面丟鏈,並且取出k個堆頂就行了。
然後就需要分類討論啥的,給你的三個點變成兩條鏈,每次取出一條鏈之後選擇權值最小的再劈成兩條鏈丟進去。
卡空間 所以樹剖,不選擇倍增
複雜度o((n+k)logn)
#include#include#include
#define mn 500000
#define n 524288
#define ll long long
using
namespace
std;
inline
intread()
while(ch>='
0'&&ch<='9')
return x*f;
}struct data
data
operator +(ll y)
};priority_queue
q;int n,k,w[mn+5],dep[mn+5],head[mn+5],cnt=0,top[mn+5],mx[mn+5
];int s[mn+5],p[mn+5],fa[mn+5],t[n*2+5],dfn[mn+5],dn=0
;struct edgee[mn+5
];inline
void ins(int f,int t);head[f]=cnt;}
vector
v[mn+5
];int merge(int x,int y)
int query(int l,int
r)
return
sum;
}inline
int up(int x,int
k)int lca(int x,int
y)pair
query(int x,int
y)
if(dfn[x]>dfn[y]) swap(x,y);
res=merge(res,query(dfn[x],dfn[y]));
return
make_pair(x,res);
}data insert(
int x,int
y,ll v)
+v;
}void solve(int x,int y,int z,int
l,ll add)
if(!(dep[x]>=dep[z]&&up(x,dep[x]-dep[z])==z)) swap(x,y);
if(x!=z) q.push(insert(x,up(x,dep[x]-dep[z]-1
),add));
q.push(insert(fa[z],y,add));
}void dfs(int x,int
tp)void pre(intx)}
intmain()
);
for(int i=2;i<=n;++i) ins(fa[i]=read(),i),dep[i]=dep[fa[i]]+1
; pre(
1);dfs(1,1
);
for(int i=1;i<=n;++i) t[i+n]=p[i];
for(int i=n;i;--i) t[i]=merge(t[i<<1],t[i<<1|1
]);
for(int i=1;i<=n;++i)
);continue
;}
if(x==y) swap(x,z);v[i].push_back(insert(x,y,0
));
if(z==y||z==x) continue
;
int l1=lca(x,z),l2=lca(y,z),l=lca(x,y);
if(dep[z]0
));
else
if(z!=l1&&z!=l2)
}for(int i=1;i<=k;++i)
return0;
}
1292 聖誕老人
這道題是一道動態規劃題 for int j 0 j 上面是該題的式子。例如 測試資料 315 199 155 301 215 170 150 25 當發射第二顆飛彈時i 2,我們另j 0。首先a j a i 即a 0 a 2 成立。於是我們看一下ans j 1 ans i ans 0 1 ans 2...
聖誕老人的禮物
問題描述 聖誕節來臨了,在城市a中聖誕老人準備分發糖果,現在有多箱不同的糖果,每箱糖果有自己的價值和重量,每箱糖果都可以拆分成任意散裝組合帶走。聖誕老人的馴鹿最多只能承受一定重量的糖果,請問聖誕老人最多能帶走多大價值的糖果。輸入 第一行由兩個部分組成,分別為糖果箱數正整數n 1 n 100 馴鹿能承...
貪心 聖誕老人的禮物
聖誕節來臨了,聖誕老人準備分發糖果,現在有多箱不同的糖果,每箱糖果有自己的價值和重量,每箱糖果都可以拆分成任意散裝組合帶走。聖誕老人的馴鹿雪橇最多只能裝下重量w的糖果。請問聖誕老人最多能帶走多大價值的糖果。第一行由兩個部分組成,分別為糖果箱數正整 n 1 n 100 馴鹿能承受的最大重量正整數 w ...