[BZOJ1103][POI2007]大都市meg(dfs序+树状数组)
2018-03-14 11:08
435 查看
题目:
我是超链接题解:
诶这不是链剖的基本操作吗?链剖那么长我才不想写咧其实这道题目确实有简单的方法的
一开始除了1节点别的点对子树都有1的贡献,修改掉一条边之后,只会对深的那个点的子树造成-1的影响,此时查询in[x]的前缀和就是答案了
代码:
#include <cstdio> #include <iostream> using namespace std; const int N=250005; int tot,nxt[N*2],point ,v[N*2],out ,in ,num,c ; void addline(int x,int y) { ++tot; nxt[tot]=point[x]; point[x]=tot; v[tot]=y; ++tot; nxt[tot]=point[y]; point[y]=tot; v[tot]=x; } void dfs(int x,int fa) { in[x]=++num; for (int i=point[x];i;i=nxt[i]) if (v[i]!=fa) dfs(v[i],x); out[x]=num; } void add(int loc,int vv){if (loc==0) return;for (int i=loc;i<=num;i+=i&(-i)) c[i]+=vv;} int qurry(int loc) { int ans=0; for (int i=loc;i>=1;i-=i&(-i)) ans+=c[i]; return ans; } int main() { int n,q,x,y;scanf("%d",&n); for (int i=1;i<n;i++) { int x,y;scanf("%d%d",&x,&y); addline(x,y); } dfs(1,0); for (int i=2;i<=n;i++) add(in[i],1),add(out[i]+1,-1); scanf("%d",&q);char st[5]; while (scanf("%s",st)!=EOF) { if (st[0]=='W') { scanf("%d",&x); printf("%d\n",qurry(in[x])); } else { scanf("%d%d",&x,&y); if (in[x]<in[y]) swap(x,y); add(in[x],-1); add(out[x]+1,1); } } }
相关文章推荐
- bzoj 1103: [POI2007]大都市meg【dfs序+树状数组】
- bzoj1103 [POI2007]大都市meg
- Bzoj1103 [POI2007]大都市meg
- bzoj1103 [POI2007]大都市meg
- BZOJ1103 [POI2007]大都市meg 【树剖】
- bzoj 1103: [POI2007]大都市meg(树链剖分)
- bzoj1103【POI2007】大都市meg
- BZOJ1103 [POI2007]大都市meg 【树剖】
- bzoj1103 POI2007 大都市meg
- BZOJ 1103: [POI2007]大都市meg [DFS序 树状数组]
- 【bzoj 1103】[POI2007]大都市meg
- 【BZOJ】1103: [POI2007]大都市meg
- BZOJ 1103: [POI2007]大都市meg 树链剖分, 树状数组+DFS序
- 8.3 bzoj1103 [POI2007]大都市meg
- bzoj1103: [POI2007]大都市meg
- BZOJ1103: [POI2007]大都市meg
- BZOJ 1103: [POI2007]大都市meg
- [bzoj1103][poi2007]大都市meg(DFS序)
- BZOJ 1103: [POI2007]大都市meg(dfs序,树状数组)
- [bzoj1103][POI2007]大都市meg_dfs序_树状数组