[dfs序 树状数组] BZOJ 1103 [POI2007]大都市meg

来源:互联网 发布:社交网络 推荐 综述 编辑:程序博客网 时间:2024/05/16 13:04

大水题

据说树链剖分可暴力过?


#include<cstdio>#include<cstdlib>#include<algorithm>using namespace std;inline char nc(){static char buf[100000],*p1=buf,*p2=buf;if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; }return *p1++;}inline void read(int &x){char c=nc(),b=1;for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;}inline void read(char &x){for (x=nc();x!='A' && x!='W';x=nc());}const int N=250005;namespace BIT{  #define lowbit(x) ((x)&-(x))    int maxn,c[N];      inline void init(int n){          maxn=n;      }      inline void add(int x,int r){          for (int i=x;i<=maxn;i+=lowbit(i))              c[i]+=r;      }      inline void add(int l,int r,int x){          add(l,x); add(r+1,-x);      }      inline int query(int x){          int ret=0;          for (int i=x;i;i-=lowbit(i))              ret+=c[i];          return ret;      }}struct edge{int u,v,next;};edge G[N<<1];int head[N],inum;inline void add(int u,int v,int p){G[p].u=u; G[p].v=v; G[p].next=head[u]; head[u]=p;}int n;int fat[N],size[N],depth[N];int clk,tid[N],last[N];#define V G[p].vinline void dfs(int u,int fa){fat[u]=fa; depth[u]=depth[fa]+1; size[u]=1; tid[u]=++clk;for (int p=head[u];p;p=G[p].next)if (V!=fa)dfs(V,u),size[u]+=size[V];last[u]=tid[u]+size[u]-1;}int main(){int Q,iu,iv,ans; char order;freopen("t.in","r",stdin);freopen("t.out","w",stdout);read(n); BIT::init(n);for (int i=1;i<n;i++)read(iu),read(iv),add(iu,iv,++inum),add(iv,iu,++inum);dfs(1,0);read(Q); Q+=n-1;while (Q--){read(order);if (order=='A'){read(iu); read(iv);if (depth[iu]<depth[iv]) swap(iu,iv);BIT::add(tid[iu],last[iu],1);}else if (order=='W'){read(iu);ans=BIT::query(tid[iu]);ans=depth[iu]-1-ans;printf("%d\n",ans);}}return 0;}


0 0
原创粉丝点击