poj3321_Apple Tree(树状数组)
2015-05-29 13:30
387 查看
思路:dfs排序,然后映射到树状数组中
#include<iostream> #include<vector> #include<string.h> #include<cstdio> using namespace std; struct node{ int p; node* nex; }; node edge[100010]; int lran[100010], rran[100010], bit[100010]; bool hava[100010]; int n, key; int lowbit(int i) { return i&(-i); } void update(int i, int x) { while (i <= n) { bit[i] += x; i += lowbit(i); } } int query(int i) { int sum = 0; while (i > 0) { sum += bit[i]; i -= lowbit(i); } return sum; } void dfs(int i) { lran[i] = key; node *t = edge[i].nex; while (t) { key++; dfs(t->p); t = t->nex; } rran[i] = key; } int main() { while (scanf("%d", &n)!=-1){ for (int i = 0; i <= n; i++) edge[i].nex = 0; for (int i = 0; i < n - 1; i++) { int a, b; scanf("%d %d", &a, &b); node *t = new node; t->p = b; t->nex = 0; if (edge[a].nex == 0) edge[a].nex = t; else{ node *p = edge[a].nex; node *pp = 0; while (p) { pp = p; p = p->nex; } pp->nex = t; } } memset(hava, true, sizeof(hava)); for (int i = 1; i <= n; i++) update(i, 1); key = 1; dfs(1); int m; scanf("%d", &m); for (int i = 0; i < m; i++) { getchar(); char c; int a; scanf("%c %d", &c, &a); if (c == 'Q') printf("%d\n", query(rran[a]) - query(lran[a]) + (hava[lran[a]] ? 1 : 0)); else { if (hava[lran[a]]) update(lran[a], -1); else update(lran[a], 1); hava[lran[a]] = !hava[lran[a]]; } } } return 0; }
相关文章推荐
- FFmpeg在iOS上完美编译
- iOS webView中调用JS与JS注入
- iOS7 edgesForExtendedLayout
- android Intent机制详解
- Android应用程序的五大基本组件
- Android-framework
- android布局分析工具
- Android必知必会--使用shape制作drawable素材
- Android必知必会--使用shape制作drawable素材
- `cocos2dx非完整` 游戏架构缩影 添加启动流程
- Swift开发教程--UITextField输入框如何隐藏软键盘
- Toncat-OpenSSL双向认证配置(iOS)
- android studio 更改背景和设置字体大小
- Android 自定义View(button)
- ANDROID 自定义VIEW 的相关说明
- Android 开发工具类 21_SAXForHandler
- Android wear的数据通讯方式之DataItems
- AndroidManifest.xml配置文件详解
- xcode 运行错误总结
- 菜鸟学Android(八):dom4j的增删改查