POJ3321 Apple Tree
2012-07-06 16:18
316 查看
http://poj.org/problem?id=3321
题意:一棵具有n个节点的树,一开始,每个节点上都有一个苹果。现在给出m组动态的操作:(C,i)是摘掉第i个节点上面的苹果(若苹果不存在,则为加上一个苹果),(Q,i)是查询以第i个节点为根的子树有几个苹果(包括第i个节点)。
做法:将每个点重新编号,使每个点的编号大于它的所有子节点的编号,这样,记录下该节点的最小子节点编号,就可以区间地求某个节点的苹果总数了。方法实现方法就是后序遍历整颗树,并将节点映射到新的编号上。接下来就是裸的树状数组了。
这个TLE
题意:一棵具有n个节点的树,一开始,每个节点上都有一个苹果。现在给出m组动态的操作:(C,i)是摘掉第i个节点上面的苹果(若苹果不存在,则为加上一个苹果),(Q,i)是查询以第i个节点为根的子树有几个苹果(包括第i个节点)。
做法:将每个点重新编号,使每个点的编号大于它的所有子节点的编号,这样,记录下该节点的最小子节点编号,就可以区间地求某个节点的苹果总数了。方法实现方法就是后序遍历整颗树,并将节点映射到新的编号上。接下来就是裸的树状数组了。
#include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> #include<vector> using namespace std; #define N 100010 bool visit ;//判断该点在dfs中是否访问过,非映射 int apple ;//判断该点是否有苹果,映射 int lowbit ; int map ;//存放映射 int low ;//存放当前节点子节点的最小编号,非映射 int c ;//存放区间的苹果数 typedef vector<int> INT; vector<INT> G(N); int n; int time=1; inline void init(void) { int i; for(i=1;i<=N-10;i++) { c[i]=i&(-i); apple[i]=true; lowbit[i]=c[i]; } return ; } void dfs(int v) { visit[v]=true; low[v]=time;//最小子节点编号 int i; for(i=0;i<G[v].size();i++) { if(!visit[G[v][i]]) dfs(G[v][i]); } map[v]=time++;//映射到新点 } void update(int a) { int t; if(apple[a]) { apple[a]=false; t=-1; } else { apple[a]=true; t=1; } while(a<=n) { c[a]+=t; a+=lowbit[a]; } } int sum(int a) { int s=0; while(a>0) { s+=c[a]; a-=lowbit[a]; } return s; } int main(void) { init(); scanf("%d",&n); int i; for(i=1;i<=n-1;i++) { int a,b; scanf("%d %d",&a,&b);//去看了别人的程序,有的人只加了一条边,这样可以么。。? G[a].push_back(b); G[b].push_back(a); } dfs(1); // printf("%d\n",time); int q; scanf("%d",&q); char s[3]; int v; for(i=1;i<=q;i++) { scanf("%s%d",s,&v); if(s[0]=='Q') { printf("%d\n",sum(map[v])-sum(low[v]-1)); } else if(s[0]=='C') { update(map[v]); } } return 0; }
这个TLE
#include <cstdio> #include <cstring> #include <cmath> #include <map> #include <set> #include <vector> #include <iostream> #include <algorithm> #include <queue> using namespace std; const double eps=1e-8; const double INF=1e50; //const double pi=acos(-1); #define N 100005 int n,a ,num; struct point { int b,e; }p ; vector<int> f ; bool apple ,tp ; #define FF struct ff int lowbit(int x) { return x&(x^(x-1)); } void add(int p,int d) { while(p<=n) { a[p]+=d; p+=lowbit(p); } } int sum(int p) { int ret=0; while (p) { ret+=a[p]; p-=lowbit(p); } return ret; } void dfs(int x) { num+=1; tp[x]=false; p[x].b=num; for (int i=0;i<f[x].size();i++) if (tp[f[x][i]) dfs(f[x][i]); p[x].e=num; } void build() { int i,s,t; for (i=1;i<n;i++) { scanf("%d%d",&s,&t); f[s].push_back(t); //f[t].push_back(s); } /*for (i=1;i<=n;i++) { a[i]=0; tp[i]=true; apple[i]=true; }*/ memset(a,0,sizeof(a)); memset(tp,true,sizeof(tp)); memset(apple,true,sizeof(apple)); num=0; dfs(1); for (i=1;i<=n;i++) add(p[i].b,1); } int main() { freopen("a","r",stdin); int m1,i,m; scanf("%d",&n); build(); scanf("%d\n",&m1); char ch; for (i=1;i<=m1;i++) { scanf("%c %d\n",&ch,&m); if (ch=='C') { if (apple[p[m].b]==true) { add(p[m].b,-1); apple[p[m].b]=false; } else { add(p[m].b,1); apple[p[m].b]=true; } } else printf("%d\n",sum(p[m].e)-sum(p[m].b-1)); } return 0; }
相关文章推荐
- 【树状数组--dfs序转化】poj3321 Apple Tree
- POJ3321 Apple Tree
- ACM学习历程——POJ3321 Apple Tree(搜索,线段树)
- poj3321 Apple Tree
- Poj3321 Apple Tree【DFS序】【树状数组】
- POJ3321 Apple Tree(树状数组 + dfs + 线性表)
- 【树状数组】 poj3321 Apple Tree
- POJ3321 - Apple Tree
- poj3321——Apple Tree
- poj3321 Apple Tree
- POJ3321 Apple tree
- POJ3321---Apple Tree(树状数组)
- POJ3321 Apple Tree
- POJ3321:Apple Tree(树状数组)
- POJ3321 Apple Tree
- POJ3321 Apple Tree
- POJ3321 Apple Tree
- poj3321_Apple Tree(树状数组)
- poj3321 Apple Tree
- [POJ3321] Apple Tree 苹果树 - 树状数组