• BZOJ3589动态树


    **错误改了一上午。

    先做熟练泼粪

    k<=5,因此我们可以模拟这个过程,在线段树上把标记建出来然后pushup时候更新就好了。

    By:大奕哥

      1 #include<bits/stdc++.h>
      2 using namespace std;
      3 const int N=200005;
      4 struct tree{
      5     int l,lz,ll;long long s,ret;
      6 }t[N<<2];
      7 int head[N],cnt,n,id,bel[N],pos[N],size[N],d[N],f[N],son[N],ed[N];
      8 struct node{
      9     int to,nex;
     10 }e[N<<1];
     11 void add(int x,int y)
     12 {
     13     e[++cnt].to=y;e[cnt].nex=head[x];head[x]=cnt;
     14 }
     15 void dfs(int x)
     16 {
     17     size[x]=1;
     18     for(int i=head[x];i;i=e[i].nex)
     19     {
     20         int y=e[i].to;
     21         if(y==f[x])continue;
     22         d[y]=d[x]+1;f[y]=x;
     23         dfs(y);
     24         if(size[y]>size[son[x]])son[x]=y;
     25         size[x]+=size[y];
     26     }
     27     return;
     28 }
     29 void dfs2(int x,int chain)
     30 {
     31     pos[x]=++id;bel[x]=chain;
     32     if(son[x])dfs2(son[x],chain);
     33     for(int i=head[x];i;i=e[i].nex)
     34     {
     35         int y=e[i].to;
     36         if(y==f[x]||y==son[x])continue;
     37         dfs2(y,y);
     38     }
     39     ed[x]=id;
     40     return;
     41 }
     42 void update(int x,int z)
     43 {
     44     t[x].lz+=z;
     45     t[x].s+=z*t[x].l;
     46 }
     47 void update2(int x,int z)
     48 {
     49     t[x].ll=z;
     50     t[x].ret=t[x].s*z;
     51 }
     52 void pushdown(int x)
     53 {
     54     if(t[x].lz)
     55     {
     56         update(x<<1,t[x].lz);
     57         update(x<<1|1,t[x].lz);
     58         t[x].lz=0;
     59     }
     60     if(t[x].ll!=-1)
     61     {
     62         update2(x<<1,t[x].ll);
     63         update2(x<<1|1,t[x].ll);
     64         t[x].ll=-1;
     65     }
     66     return;
     67 }
     68 void pushup(int x)
     69 {
     70     t[x].s=t[x<<1].s+t[x<<1|1].s;
     71     t[x].ret=t[x<<1].ret+t[x<<1|1].ret;
     72 }
     73 void build(int x,int l,int r)
     74 {
     75     t[x].ll=-1;
     76     if(l==r){
     77         t[x].l=1;return;
     78     }
     79     int mid=l+r>>1;
     80     t[x].l=r-l+1;
     81     build(x<<1,l,mid);build(x<<1|1,mid+1,r);
     82 }
     83 void paint(int x,int l,int r,int L,int R,int w)
     84 {
     85     if(t[x].ll==w)return;
     86     if(l==L&&r==R){
     87         update2(x,w);
     88         return;
     89     }
     90     pushdown(x);
     91     int mid=l+r>>1;
     92     if(mid<L)paint(x<<1|1,mid+1,r,L,R,w);
     93     else if(mid>=R)paint(x<<1,l,mid,L,R,w);
     94     else paint(x<<1,l,mid,L,mid,w),paint(x<<1|1,mid+1,r,mid+1,R,w);
     95     pushup(x);
     96     return;
     97 }
     98 void change(int x,int l,int r,int L,int R,int c)
     99 {
    100     if(l==L&&r==R)
    101     {
    102         update(x,c);
    103         return;
    104     }
    105     pushdown(x);
    106     int mid=l+r>>1;
    107     if(mid<L)change(x<<1|1,mid+1,r,L,R,c);
    108     else if(mid>=R)change(x<<1,l,mid,L,R,c);
    109     else change(x<<1,l,mid,L,mid,c),change(x<<1|1,mid+1,r,mid+1,R,c);
    110     pushup(x);
    111 }
    112 void color(int x,int y,int c)
    113 {
    114     while(bel[x]!=bel[y])
    115     {
    116         if(d[bel[x]]<d[bel[y]])swap(x,y);
    117         paint(1,1,n,pos[bel[x]],pos[x],c);
    118         x=f[bel[x]];
    119     }
    120     if(d[x]<d[y])swap(x,y);
    121     paint(1,1,n,pos[y],pos[x],c);
    122     return;
    123 }
    124 int main()
    125 {
    126     int x,y,q,ff,k;
    127     scanf("%d",&n);
    128     for(int i=1;i<n;++i)
    129     {
    130         scanf("%d%d",&x,&y);
    131         add(x,y);add(y,x);
    132     }
    133     dfs(1);dfs2(1,1);
    134     build(1,1,n);
    135     scanf("%d",&q);
    136     for(int i=1;i<=q;++i)
    137     {
    138         scanf("%d",&ff);
    139         if(ff==0)
    140         {
    141             scanf("%d%d",&x,&y);
    142             change(1,1,n,pos[x],ed[x],y);
    143         }
    144         else{
    145             scanf("%d",&k);
    146             for(int j=1;j<=k;++j)
    147             {
    148                 scanf("%d%d",&x,&y);
    149                 color(x,y,1);
    150             }
    151             printf("%d
    ",t[1].ret&((1ll<<31)-1));
    152             update2(1,0);
    153         }
    154     }
    155     return 0;
    156 }
  • 相关阅读:
    基准测试github.com/BrennanConroy/BlogPost60Bench
    消息中间件RabbitMQ
    蓝绿部署、金丝雀发布(灰度发布)、AB测试
    内存缓存与分布式缓存的使用
    DDD分层架构
    .NET MAUI 正式发布,再见了 Xamarin.Forms
    [LeetCode] 1301. Number of Paths with Max Score 最大得分的路径数目
    [LeetCode] 1302. Deepest Leaves Sum 层数最深叶子节点的和
    新功能发布:突出显示代码块的指定行
    上周热点回顾(5.165.22)
  • 原文地址:https://www.cnblogs.com/nbwzyzngyl/p/8440964.html
Copyright © 2020-2023  润新知