codevs p4633

来源:互联网 发布:修车的软件app 编辑:程序博客网 时间:2024/06/04 09:22

模板题

#include <bits/stdc++.h>#define lc (o<<1)#define rc (lc|1)#define m ((l+r)>>1)using namespace std;const int MAXN = 100000 + 5;int lazy[MAXN<<2],sum[MAXN<<2];int dep[MAXN],fa[MAXN],siz[MAXN],son[MAXN],top[MAXN],pos[MAXN],sz=0,ec=0;int to[MAXN<<1],next[MAXN<<1],fst[MAXN];int n;int in(){int c=getchar(),x=0;while(!isdigit(c))c=getchar();while(isdigit(c)){x=x*10+c-'0';c=getchar();}return x;}inline void up(int o,int l,int r){sum[o]=0;if(l<r)sum[o]=sum[lc]+sum[rc];if(lazy[o])sum[o]+=lazy[o]*(r-l+1);}void update(int o,int l,int r,int cl,int cr,int cv){if(cl<=l && r<=cr)lazy[o]+=cv;else{if(cl<=m)update(lc,l,m,cl,cr,cv);if(m+1<=cr)update(rc,m+1,r,cl,cr,cv);}up(o,l,r);}int query(int o,int l,int r,int ql,int qr,int add){int ans=0;if(ql<=l && r<=qr)return sum[o]+add*(r-l+1);if(ql<=m)ans+=query(lc,l,m,ql,qr,add+lazy[o]);if(m+1<=qr)ans+=query(rc,m+1,r,ql,qr,add+lazy[o]);return ans;}void dfs1(int u,int f,int d){dep[u]=d;fa[u]=f;siz[u]=1;son[u]=0;for(int i=fst[u];i;i=next[i]){int v=to[i];if(v==f)continue;dfs1(v,u,d+1);siz[u]+=siz[v];if(siz[son[u]]<siz[v])son[u]=v;}}void dfs2(int u,int tp){top[u]=tp;pos[u]=++sz;if(son[u])dfs2(son[u],tp);for(int i=fst[u];i;i=next[i]){int v=to[i];if(v!=fa[u] && v!=son[u])dfs2(v,v);}}int add(int u,int v){to[++ec]=v;next[ec]=fst[u];fst[u]=ec;}int ask(int u,int v){int ans=0;while(top[u]!=top[v]){if(dep[top[u]]<dep[top[v]])swap(u,v);ans+=query(1,1,n,pos[top[u]],pos[u],0);u=fa[top[u]];}if(dep[u]>dep[v])swap(u,v);ans+=query(1,1,n,pos[u],pos[v],0);return ans;}void modify(int u,int v){while(top[u]!=top[v]){if(dep[top[u]]<dep[top[v]])swap(u,v);update(1,1,n,pos[top[u]],pos[u],1);u=fa[top[u]];}if(dep[u]>dep[v])swap(u,v);update(1,1,n,pos[u],pos[v],1);}int main(){n=in();for(int i=1;i<=n-1;i++){int x=in(),y=in();add(x,y);add(y,x);}dfs1(1,0,1);dfs2(1,1);int q=in();for(int i=1;i<=q;i++){int a=in(),b=in(),c=in();if(a==1)modify(b,c);else {int ans=ask(b,c);printf("%d\n",ans);}}return 0;}


0 0
原创粉丝点击