[poj 3321]Apple Tree[树状数组]
2013-10-23 20:40
387 查看
题意:
树杈上长苹果,统计苹果数.
思路:
将树通过dfs映射到线性序列, 用树状数组计数.
树杈上长苹果,统计苹果数.
思路:
将树通过dfs映射到线性序列, 用树状数组计数.
#include <cstring> #include <cstdio> #include <algorithm> using namespace std; const int MAXN = 100010; int n,m; int head[MAXN],num; struct pool { int v,next; }g[MAXN]; void add(int u, int v) { g[++num].v = v; g[num].next = head[u]; head[u] = num; } inline int lowbit(int x) { return x&(-x); } int l[MAXN],r[MAXN]; void dfs(int u) { l[u] = ++num; for(int i=head[u];i;i=g[i].next) { //printf("i = %d, dfs(%d);\n",i,g[i].v); dfs(g[i].v); } r[u] = num; } int a[MAXN],c[MAXN]; int sum(int x) { int ans = 0; for(;x>0;x^=lowbit(x)) ans += c[x]; return ans; } void modify(int x, int d) { for(;x<=n;x+=lowbit(x)) c[x] += d; } int main() { scanf("%d",&n); for(int i=0,v,u;i<n-1;i++) { scanf("%d%d",&u,&v); add(u, v); } num = 0; // printf("&&&"); dfs(1); // printf("***"); for(int i=1;i<=n;i++)//init { a[i] = 1; c[i] = lowbit(i); } scanf("%d",&m); char s[5]; while(m--) { scanf("%s%d",s,&num); if(s[0]=='C') { modify(l[num],a[num]?-1:1); a[num] ^= 1; } else printf("%d\n",sum(r[num])-sum(l[num]-1)); } }
相关文章推荐
- 在Windows XP中为Android 4.0设备安装MTP驱动程序
- android 多屏 多任务
- Unity界面插件NGUI核心组件说明
- android json解析及简单例子
- opengl 教程(23) shadow mapping (1)
- Android 开发环境搭建
- 升级iOS7心得
- Application Log--使用BAL_DSP_LOG_DISPLAY展现日志
- iOS开发之应用生命周期
- Android优秀开源项目
- Android 本地推送消息到通知栏 NotificationManager 、注册Android Service
- android多国语言使用
- 再谈webview漏洞
- android 开发学习1_用户界面(连载)
- Android源码获取过程卡住 repo sync 卡住
- cocos2dx-plugin for ios
- 文件加密解密小程序
- [DEVDIV原创] Android系统的初始化流程
- Android结构各层
- cocos2d-x跨android&ios平台开发入门教程