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

Qtree1 - 树链剖分

时间:2018-02-28 23:07:40      阅读:339      评论:0      收藏:0      [点我收藏+]

标签:blog   shu   air   sizeof   eof   include   ret   main   build   

树剖裸题?(复习练练手)

  1 // luogu-judger-enable-o2
  2 #include <bits/stdc++.h>
  3 using namespace std;
  4 
  5 int n,vis[100005],size[100005],dep[100005],fa[100005][20],val[100005],wson[100005],t1,t2,t3,t4,ind;
  6 int tid[100005],sid[100005],top[100005],eg1[100005],eg2[100005];
  7 vector <pair<int,int> > g[100005];
  8 char str[105];
  9 
 10 void dfs1(int p){
 11     vis[p]=1;
 12     size[p]=1;
 13     for(int i=0;i<g[p].size();i++) {
 14         if(vis[g[p][i].first]==0) {
 15             dep[g[p][i].first]=dep[p]+1;
 16             fa[g[p][i].first][0]=p;
 17             val[g[p][i].first]=g[p][i].second;
 18             dfs1(g[p][i].first);
 19             size[p]+=size[g[p][i].first];
 20             if(size[g[p][i].first]>size[wson[p]])
 21                 wson[p]=g[p][i].first;
 22         }
 23     }
 24 }
 25 
 26 void dfs2(int p){
 27     vis[p]=1;
 28     tid[++ind]=p;
 29     sid[p]=ind;
 30     if(wson[p]) {
 31         top[wson[p]]=top[p];
 32         dfs2(wson[p]);
 33     }
 34     for(int i=0;i<g[p].size();i++) {
 35         if(vis[g[p][i].first]==0) {
 36             top[g[p][i].first]=g[p][i].first;
 37             dfs2(g[p][i].first);
 38         }
 39     }
 40 }
 41 
 42 void lca_presolve() {
 43     for(int i=1;i<=17;i++) 
 44         for(register int j=1;j<=n;j++)
 45             fa[j][i]=fa[fa[j][i-1]][i-1];
 46 }
 47 
 48 inline int lca(int p,int q){
 49     if(dep[p]<dep[q]) swap(p,q);
 50     for(register int i=17;i>=0;i--)
 51         if(dep[fa[p][i]]>=dep[q]) p=fa[p][i];
 52     for(register int i=17;i>=0;i--)
 53         if(fa[p][i]-fa[q][i]) p=fa[p][i],q=fa[q][i];
 54     if(p-q) p=fa[p][0], q=fa[q][0];
 55     return max(p,q);
 56 }
 57 
 58 int a[500005],sq[500005];
 59 
 60 void pushup(int p) {
 61     a[p]=max(a[p*2],a[p*2+1]);
 62 }
 63 
 64 void build(int p,int l,int r) {
 65     if(l==r) a[p]=sq[l];
 66     else build(p*2,l,(l+r)/2), build(p*2+1,(l+r)/2+1,r), pushup(p);
 67 }
 68 
 69 void modify(int p,int l,int r,int pos,int k) {
 70     if(l==r) {
 71         a[p]=k;
 72         sq[pos]=k;
 73     }
 74     else {
 75         if(pos<=(l+r)/2) modify(p*2,l,(l+r)/2,pos,k);
 76         else modify(p*2+1,(l+r)/2+1,r,pos,k);
 77         pushup(p);
 78     }
 79 }
 80 
 81 int query(int p,int l,int r,int ql,int qr) {
 82     if(l>qr||r<ql) return 0;
 83     if(l>=ql&&r<=qr) return a[p];
 84     return max(query(p*2,l,(l+r)/2,ql,qr),query(p*2+1,(l+r)/2+1,r,ql,qr));
 85 }
 86 
 87 void readin() {
 88     scanf("%d",&n);
 89     for(int i=1;i<n;i++) {
 90         scanf("%d%d%d",&t1,&t2,&t3);
 91         eg1[i]=t1;
 92         eg2[i]=t2;
 93         g[t1].push_back(make_pair(t2,t3));
 94         g[t2].push_back(make_pair(t1,t3));
 95     }
 96 }
 97 
 98 void init() {
 99     dep[1]=1;
100     dfs1(1);
101     memset(vis,0x00,sizeof vis);
102     dfs2(1);
103     lca_presolve();
104     for(int i=1;i<=n;i++) 
105         sq[i]=val[tid[i]];
106     build(1,1,n);
107 }
108 
109 void tmodify(int pos,int key){
110     modify(1,1,n,sid[pos],key);
111 }
112 
113 int lquery(int anc,int son) {
114     int ans=0;
115     while(dep[top[son]]>dep[anc]) 
116         ans=max(ans,query(1,1,n,sid[top[son]],sid[son])),
117         son=fa[top[son]][0];
118     ans=max(ans,query(1,1,n,sid[anc]+1,sid[son]));
119     return ans;
120 }
121 
122 int tquery(int p,int q) {
123     int l=lca(p,q);
124     return max(lquery(l,p),lquery(l,q));
125 }
126 
127 int main(){
128     readin();
129     init();
130     for(int i=1;1;i++) {
131         scanf("%s",&str);
132         if(str[0]==D) return 0;
133         scanf("%d%d",&t2,&t3);
134         if(str[0]==C) tmodify((dep[eg1[t2]]>dep[eg2[t2]])?eg1[t2]:eg2[t2],t3);
135         else printf("%d\n",tquery(t2,t3));
136     }
137 }

 

Qtree1 - 树链剖分

标签:blog   shu   air   sizeof   eof   include   ret   main   build   

原文地址:https://www.cnblogs.com/mollnn/p/8486000.html

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