BZOJ4910 : [Sdoi2017] 蘋果樹

來源:互聯網
上載者:User

標籤:print   mem   dfs   沒有   --   emc   路徑   允許   clu   

問題等價於樹形依賴背包,允許一條鏈每個點各免費一次。

設$f[i][j]$表示按DFS序考慮到$i$,體積為$j$的最大收益。

先放入不能免費的物品,等遍曆完兒子後再放入必選的物品,那麼$i$到根路徑上所有點都只算了不能免費的部分。

然後將DFS序翻轉,設$h[i][j]$表示按DFS序考慮到$i$,體積為$j$的最大收益。

等遍曆完兒子後再放入必選的物品和不能免費的物品,那麼$i$到根路徑上所有點都沒有算。

如此一來,對於每個葉子$i$,用$f[i][j]+h[i][k-j]$更新答案即可。

對於不能免費的物品,需要用單調隊列最佳化轉移。

時間複雜度$O(nk)$。

 

#include<cstdio>#include<cstring>const int N=20010,M=25520010;int Case,n,m,K,T,i,fa[N],a[N],b[N],g[N],nxt[N],ans,F[M],H[M];inline void add(int x,int y){nxt[y]=g[x];g[x]=y;}inline void up(int&a,int b){a<b?(a=b):0;}inline void solve(int*f,int A,int B){  int i,j=0,h=1,t=0;  static int q[500010],p[500010];  for(i=0;i<=m;i++,j+=B){    f[i]-=j;    while(h<=t&&f[q[t]]<f[i])t--;    q[++t]=i;    while(i-q[h]>A)h++;    p[i]=f[q[h]]+j;  }  memcpy(f,p,T);}void dfsl(int x){  int i,j,A=a[x],B=b[x];  if(A)solve(F+x*K,A,B);  for(i=g[x];i;i=nxt[i]){    memcpy(F+i*K,F+x*K,T);    dfsl(i);    B=b[i];    int*s=F+x*K+1,*e=F+i*K;    for(j=1;j<=m;j++,s++,e++)up(*s,*e+B);  }}void dfsr(int x,int y){  int i,j,A=a[x],B=b[x];  y+=B;  for(i=g[x];i;i=nxt[i]){    memcpy(H+i*K,H+x*K,T);    dfsr(i,y);    B=b[i];    int*s=H+x*K+1,*e=H+i*K;    for(j=1;j<=m;j++,s++,e++)up(*s,*e+B);  }  if(!g[x]){    int*s=H+x*K+m,*e=F+x*K;    for(j=0;j<=m;j++,s--,e++)up(ans,*s+*e+y);  }  if(A)solve(H+x*K,A,b[x]);}int main(){  scanf("%d",&Case);  while(Case--){    scanf("%d%d",&n,&m);    K=m+1;T=K*sizeof(int);    for(i=1;i<=n;i++)g[i]=0;    for(i=1;i<=n;i++){      scanf("%d%d%d",&fa[i],&a[i],&b[i]);a[i]--;      if(fa[i])add(fa[i],i);    }    memset(F+K,0,T);    memset(H+K,0,T);    dfsl(1);    for(i=1;i<=n;i++)g[i]=0;    for(i=n;i;i--)if(fa[i])add(fa[i],i);    ans=0;    dfsr(1,0);    printf("%d\n",ans);  }  return 0;}

  

BZOJ4910 : [Sdoi2017] 蘋果樹

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.