zoukankan      html  css  js  c++  java
  • bzoj 2809: [Apio2012]dispatching

     1 #include<cstdio>
     2 #include<algorithm>
     3 #define M 1000005
     4 using namespace std;
     5 long long ans,sum[M],size[M];
     6 int tot,n,m,head[M],next[M],u[M],c[M],L[M],cnt,root[M];
     7 int l[M],r[M],v[M];
     8 void jia(int a1,int a2)
     9 {
    10     cnt++;
    11     next[cnt]=head[a1];
    12     u[cnt]=a2;
    13     head[a1]=cnt;
    14     return;
    15 }
    16 int he(int a1,int a2)
    17 {
    18     if(!a1||!a2)
    19       return a1+a2;
    20     if(v[a1]<v[a2])
    21       swap(a1,a2);
    22     r[a1]=he(r[a1],a2);
    23     swap(l[a1],r[a1]);
    24     return a1;
    25 }
    26 void dfs(int a1)
    27 {
    28     root[a1]=++tot;
    29     v[tot]=c[a1];
    30     sum[a1]=c[a1];
    31     size[a1]=1;
    32     for(int i=head[a1];i;i=next[i])
    33       {
    34         dfs(u[i]);
    35         sum[a1]+=sum[u[i]];
    36         size[a1]+=size[u[i]];
    37         root[a1]=he(root[a1],root[u[i]]);
    38       }
    39     for(;sum[a1]>m;)
    40       {
    41         sum[a1]-=v[root[a1]];
    42         size[a1]--;
    43         root[a1]=he(l[root[a1]],r[root[a1]]);
    44       }
    45     ans=max(ans,size[a1]*L[a1]);
    46 }
    47 int main()
    48 {
    49     scanf("%d%d",&n,&m);
    50     for(int i=1;i<=n;i++)
    51       {
    52         int a1;
    53         scanf("%d%d%d",&a1,&c[i],&L[i]);
    54         jia(a1,i);
    55       }
    56     dfs(1);
    57     printf("%lld",ans);
    58     return 0;
    59 }

    斜堆 合并

  • 相关阅读:
    小小c#算法题
    .net中值类型、引用类型理解的c#代码示例
    小小c#算法题
    小小c#算法题
    小小c#算法题
    小小c#算法题
    python 正则表达式(一)
    python string 文本常量和模版
    centos6安装redis
    sqoop命令总结
  • 原文地址:https://www.cnblogs.com/xydddd/p/5308966.html
Copyright © 2011-2022 走看看