Qtree3

打完以后才发现写复杂了……算了懒得改了

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 
  4 int dep[100005],fa[100005][20],size[100005],wson[100005],vis[100005],sid[100005],tid[100005];
  5 int n,m,t1,t2,t3,t4,ind,top[100005],a[100005];
  6 
  7 vector <int> g[100005];
  8 
  9 void dfs1(int p) {
 10     size[p]=1;
 11     vis[p]=1;
 12     for(int i=0;i<g[p].size();i++) {
 13         if(vis[g[p][i]]) continue;
 14         dep[g[p][i]]=dep[p]+1;
 15         fa[g[p][i]][0]=p;
 16         dfs1(g[p][i]);
 17         size[p]+=size[g[p][i]];
 18         if(size[g[p][i]]>size[wson[p]]) wson[p]=g[p][i];
 19     }
 20 }
 21 
 22 void dfs2(int p) {
 23     vis[p]=1;
 24     sid[p]=++ind;
 25     tid[ind]=p;
 26     if(wson[p]) {
 27         top[wson[p]]=top[p];
 28         dfs2(wson[p]);
 29     }
 30     for(int i=0;i<g[p].size();i++) {
 31         if(vis[g[p][i]]) continue;
 32         top[g[p][i]]=g[p][i];
 33         dfs2(g[p][i]);
 34     }
 35 }
 36 
 37 void lca_presolve() {
 38     for(int i=1;i<=17;i++) 
 39         for(int j=1;j<=n;j++) 
 40             fa[j][i]=fa[fa[j][i-1]][i-1];
 41 }
 42 
 43 int lca(int p,int q) {
 44     if(dep[p]<dep[q]) swap(p,q);
 45     for(int i=17;i>=0;i--) if(dep[fa[p][i]]>=dep[q]) p=fa[p][i];
 46     for(int i=17;i>=0;i--) if(fa[p][i]-fa[q][i]) p=fa[p][i], q=fa[q][i];
 47     if(p-q) p=fa[p][0], q=fa[q][0];
 48     return max(p,q);
 49 }
 50 
 51 void pushup(int p){
 52     if(a[p*2]) a[p]=a[p*2];
 53     else a[p]=a[p*2+1];
 54 }
 55 
 56 void modify(int p,int l,int r,int pos) {
 57     if(l==r) {
 58         a[p]=a[p]?0:l;
 59         return;
 60     }
 61     if(pos<=(l+r)/2) modify(p*2,l,(l+r)/2,pos);
 62     else modify(p*2+1,(l+r)/2+1,r,pos);
 63     pushup(p);
 64 }
 65 
 66 int query(int p,int l,int r,int ql,int qr) {
 67     if(l>qr||r<ql) return 0;
 68     if(l>=ql&&r<=qr) return a[p];
 69     int q0=query(p*2,l,(l+r)/2,ql,qr);
 70     if(q0) return q0;
 71     else return query(p*2+1,(l+r)/2+1,r,ql,qr);
 72 }
 73 
 74 void tmodify(int pos) {
 75     modify(1,1,n,sid[pos]);
 76 }
 77 
 78 int lquery_upward(int anc,int son) {
 79     int ans=0;
 80     while(dep[top[son]]>dep[anc]) {
 81         ans=query(1,1,n,sid[top[son]],sid[son]);
 82         son=fa[top[son]][0];
 83         if(ans) return ans;
 84     }
 85     return query(1,1,n,sid[anc],sid[son]);
 86 }
 87 
 88 int lquery_downward(int anc,int son) {
 89     int ans=0,tmp;
 90     while(dep[top[son]]>dep[anc]) {
 91         tmp=query(1,1,n,sid[top[son]],sid[son]);
 92         if(tmp) ans=tmp;
 93         son=fa[top[son]][0];
 94     }
 95     tmp=query(1,1,n,sid[anc],sid[son]);
 96     if(tmp) ans=tmp;
 97     return ans;
 98 }
 99 
100 int tquery(int p,int q){
101     int l=lca(p,q),tmp;
102     tmp=lquery_upward(l,p);
103     if(tmp) return tmp;
104     else return lquery_downward(l,q);
105 }
106 
107 int main(){
108     ios::sync_with_stdio(false);
109     cin>>n>>m;
110     for(int i=1;i<n;i++) cin>>t1>>t2, g[t1].push_back(t2), g[t2].push_back(t1);
111     dep[1]=1; dfs1(1);
112     memset(vis,0,sizeof vis);
113     dfs2(1);
114     lca_presolve();
115     
116     for(int i=1;i<=m;i++) {
117         cin>>t1>>t2;
118         if(t1==0) tmodify(t2);
119         else t3=tid[tquery(1,t2)], cout<<(t3==0?-1:t3)<<endl;    
120     }
121 }
原文地址:https://www.cnblogs.com/mollnn/p/8487932.html