码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj 1036 树的统计Count

时间:2017-12-02 14:11:36      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:getc   tin   oid   add   col   cst   queue   struct   sdi   

题目大意:

一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w

我们将以下面的形式来要求你对这棵树完成一些操作:

I. CHANGE u t : 把结点u的权值改为t

II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值

III. QSUM u v: 询问从点u到点v的路径上的节点的权值和 注意:从点u到点v的路径上的节点包括u和v本身

思路:

树链剖分

衣服都不穿的

搞到线段树里,然后维护维护

背一背

技术分享图片
  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cmath>
  4 #include<cstdlib>
  5 #include<cstring>
  6 #include<algorithm>
  7 #include<vector>
  8 #include<queue>
  9 #define inf 2139062143
 10 #define ll long long
 11 #define MAXN 30101
 12 #define MOD
 13 using namespace std;
 14 inline int read()
 15 {
 16     int x=0,f=1;char ch=getchar();
 17     while(!isdigit(ch)) {if(ch==-) f=-1;ch=getchar();}
 18     while(isdigit(ch)) {x=x*10+ch-0;ch=getchar();}
 19     return x*f;
 20 }
 21 int n,Cnt,nxt[MAXN*2],fst[MAXN],to[MAXN*2],val[MAXN];
 22 int fa[MAXN],dep[MAXN],bl[MAXN],cnt[MAXN],hsh[MAXN];
 23 struct data{int mx,sum,l,r;}tr[MAXN*3];
 24 void add(int u,int v) {nxt[++Cnt]=fst[u],fst[u]=Cnt,to[Cnt]=v;}
 25 void build(int x)
 26 {
 27     for(int i=fst[x];i;i=nxt[i])
 28     {
 29         if(to[i]==fa[x]) continue;
 30         dep[to[i]]=dep[x]+1;
 31         fa[to[i]]=x;
 32         build(to[i]);
 33         cnt[x]+=cnt[to[i]];
 34     }
 35     cnt[x]++;
 36 }
 37 void Build(int x,int chn)
 38 {
 39     int hvs=0;hsh[x]=++Cnt,bl[x]=chn;
 40     for(int i=fst[x];i;i=nxt[i])
 41         if(fa[x]!=to[i]&&cnt[hvs]<cnt[to[i]]) hvs=to[i];
 42     if(!hvs) return ;
 43     Build(hvs,chn);
 44     for(int i=fst[x];i;i=nxt[i])
 45         if(fa[x]!=to[i]&&hvs!=to[i]) Build(to[i],to[i]);
 46 }
 47 void s_build(int k,int l,int r)
 48 {
 49     tr[k].l=l,tr[k].r=r;
 50     if(l==r) return ;
 51     int mid=(l+r)>>1;
 52     s_build(k<<1,l,mid);
 53     s_build(k<<1|1,mid+1,r);
 54 }
 55 void upd(int k,int pos,int x)
 56 {;
 57     int l=tr[k].l,r=tr[k].r;
 58     if(l==r) {tr[k].mx=tr[k].sum=x;return ;}
 59     int mid=(l+r)>>1;
 60     if(mid>=pos) upd(k<<1,pos,x);
 61     else upd(k<<1|1,pos,x);
 62     tr[k].mx=max(tr[k<<1].mx,tr[k<<1|1].mx);
 63     tr[k].sum=tr[k<<1].sum+tr[k<<1|1].sum;
 64 }
 65 int q_sum(int k,int a,int b)
 66 {
 67     int l=tr[k].l,r=tr[k].r;
 68     if(l==a&&r==b) return tr[k].sum;
 69     int mid=(l+r)>>1;
 70     if(b<=mid) return q_sum(k<<1,a,b);
 71     if(a>mid) return q_sum(k<<1|1,a,b);
 72     else return q_sum(k<<1,a,mid)+q_sum(k<<1|1,mid+1,b);
 73 }
 74 int q_mx(int k,int a,int b)
 75 {
 76     int l=tr[k].l,r=tr[k].r;
 77     if(l==a&&r==b) return tr[k].mx;
 78     int mid=(l+r)>>1;
 79     if(b<=mid) return q_mx(k<<1,a,b);
 80     if(a>mid) return q_mx(k<<1|1,a,b);
 81     else return max(q_mx(k<<1,a,mid),q_mx(k<<1|1,mid+1,b));
 82 }
 83 int main()
 84 {
 85     n=read();int a,b,res;
 86     for(int i=1;i<n;i++) {a=read(),b=read();add(a,b);add(b,a);}
 87     for(int i=1;i<=n;i++) val[i]=read();fa[1]=1;
 88     build(1);Cnt=0;
 89     Build(1,1);
 90     s_build(1,1,n);
 91     for(int i=1;i<=n;i++) upd(1,hsh[i],val[i]);
 92     int T=read();
 93     char ch[8];
 94     while(T--)
 95     {
 96         scanf("%s",ch);a=read(),b=read();
 97         if(ch[0]==C) {val[a]=b;upd(1,hsh[a],b);}
 98         else if(ch[1]==M)
 99         {
100             res=-inf;
101             while(bl[a]!=bl[b])
102             {
103                 if(dep[bl[a]]<dep[bl[b]]) swap(a,b);
104                 res=max(res,q_mx(1,hsh[bl[a]],hsh[a]));
105                 a=fa[bl[a]];
106             }
107             res=max(res,q_mx(1,min(hsh[a],hsh[b]),max(hsh[a],hsh[b])));
108             printf("%d\n",res);
109         }
110         else if(ch[1]==S)
111         {
112             res=0;
113             while(bl[a]!=bl[b])
114             {
115                 if(dep[bl[a]]<dep[bl[b]]) swap(a,b);
116                 res+=q_sum(1,hsh[bl[a]],hsh[a]);
117                 a=fa[bl[a]];
118             }
119             res+=q_sum(1,min(hsh[a],hsh[b]),max(hsh[a],hsh[b]));
120             printf("%d\n",res);
121         }
122     }
123 }
View Code

 

bzoj 1036 树的统计Count

标签:getc   tin   oid   add   col   cst   queue   struct   sdi   

原文地址:http://www.cnblogs.com/yyc-jack-0920/p/7954004.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!