日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

P1552 [APIO2012]派遣

發(fā)布時(shí)間:2023/12/10 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P1552 [APIO2012]派遣 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

鏈接

https://www.luogu.org/problemnew/show/P1552

思路

忍者數(shù)量肯定越多越好
那就從下到上的合并它的孩子
左偏樹的話
順便維護(hù)一個(gè)tot,大頭堆,如果tot大于了m,把大的刪掉
如果左偏樹忘干凈了或者沒學(xué)的話
線段樹合并也是個(gè)不錯(cuò)的選擇
直接權(quán)值線段樹合并就好,內(nèi)存30倍會(huì)炸,也許是我沒離散化的緣故吧
查詢?cè)诰€段樹上面二分

左偏樹代碼

#include <bits/stdc++.h> #define FOR(i,a,b) for(int i=a;i<=b;++i) #define ll long long using namespace std; const int maxn=100047; inline int read() {int x=0,f=1;char s=getchar();for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';return x*f; } struct edge {int v,nxt; }e[maxn]; int head[maxn],tot; void add_edge(int u,int v) {e[++tot].v=v;e[tot].nxt=head[u];head[u]=tot; } int n,m,mone; ll sum[maxn],ans; int size[maxn]; int ch[maxn][2],dis[maxn],val[maxn],xs[maxn]; int work(int a,int b) {if(!a||!b) return a+b;if(val[a]<val[b]) swap(a,b);ch[a][1]=work(ch[a][1],b);if(dis[ch[a][0]]<dis[ch[a][1]]) swap(ch[a][0],ch[a][1]);dis[a]=dis[ch[a][1]]+1;return a; } int merge(int x,int y) {int tmp=work(x,y);y=x^y^tmp,x=tmp;sum[x]+=sum[y];size[x]+=size[y];return tmp; } int delet(int x) {int tmp=work(ch[x][0],ch[x][1]);size[tmp]=size[x]-1;sum[tmp]=sum[x]-val[x];return tmp; } int dfs(int u) {int rt=u;for(int i=head[u];i;i=e[i].nxt) {int v=e[i].v;int tmp=dfs(v);rt=merge(rt,tmp);}while(sum[rt]>mone) rt=delet(rt);ans=max(ans,xs[u]*(ll)size[rt]);return rt; } int main() {n=read(),mone=read();int root;FOR(i,1,n) {int x=read();val[i]=read();xs[i]=read();sum[i]=val[i];size[i]=1;if(x) add_edge(x,i);else root=i;}int wuyong=dfs(root);cout<<ans<<"\n";return 0; }

線段樹合并代碼

#include <iostream> #include <cstdio> #include <algorithm> #include <vector> #include <utility> #define ll long long using namespace std; const int N=1e5+7; int read() {int x=0,f=1;char s=getchar();for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';return x*f; } int n,m,money[N],leader[N],rt[N]; vector<int> G[N]; struct node {int l,r,siz;ll tot; }e[N*30]; void pushup(int rt) {e[rt].siz=e[e[rt].l].siz+e[e[rt].r].siz;e[rt].tot=e[e[rt].l].tot+e[e[rt].r].tot; } int cnt; void insert(int l,int r,int L,int &rt) {rt=++cnt;if(l==r) {e[rt].siz++;e[rt].tot+=l;return;}int mid=(l+r)>>1;if(L<=mid) insert(l,mid,L,e[rt].l);else insert(mid+1,r,L,e[rt].r);pushup(rt); } int merge(int l,int r,int x,int y) {if(!x||!y) return x+y;if(l==r) {e[x].siz+=e[y].siz;e[x].tot+=e[y].tot;return x;}int mid=(l+r)>>1;e[x].l=merge(l,mid,e[x].l,e[y].l);e[x].r=merge(mid+1,r,e[x].r,e[y].r);pushup(x);return x; } int query(int l,int r,int k,int rt) {if(l==r) return k>=e[rt].tot ? e[rt].siz : 0;int mid=(l+r)>>1;if(e[e[rt].l].tot>=k) return query(l,mid,k,e[rt].l);else return e[e[rt].l].siz+query(mid+1,r,k-e[e[rt].l].tot,e[rt].r); } ll ans; void dfs(int u) {insert(1,1000000000,money[u],rt[u]);for(vector<int>::iterator it=G[u].begin();it!=G[u].end();++it) {dfs(*it);rt[u]=merge(1,1000000000,rt[u],rt[*it]);}ans=max(ans,(ll)leader[u]*query(1,1000000000,m,rt[u])); } int main() {n=read(),m=read();for(int i=1;i<=n;++i) {int x=read();money[i]=read();leader[i]=read();G[x].push_back(i);}dfs(1);printf("%lld",ans);return 0; }

轉(zhuǎn)載于:https://www.cnblogs.com/dsrdsr/p/10359546.html

總結(jié)

以上是生活随笔為你收集整理的P1552 [APIO2012]派遣的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。