POJ 3321-Apple Tree【树状数组+DFS序】 2023-08-17 17:33 388阅读 0赞 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果。卡卡很喜欢苹果。树上有*N*个节点,卡卡给他们编号1到*N*,根的编号永远是1.每个节点上最多结一个苹果。卡卡想要了解某一个子树上一共结了多少苹果。 现在的问题是不断会有新的苹果长出来,卡卡也随时可能摘掉一个苹果吃掉。你能帮助卡卡吗? Input 输入数据:第一行包含一个整数*N*(*N* <= 100000),表示树上节点的数目。 接下来*N*\-1行,每行包含2个整数*u*和*v*,表示*u*和*v*是连在一起的。 下一行包含一个整数*M*(*M* ≤ 100,000). 接下来*M*行包含下列两种命令之一: "**C *x***" 表示某个节点上的苹果发生了变化,如果原来没有苹果,则现在长出了一个苹果;如果原来有苹果,则是卡卡把它吃了。 "**Q *x***" 表示查询*x*节点上的子树上的苹果有多少。包含节点*x*. Output 对于每次查询,输出其结果。 思路:这题不难,就是通过dfs序来确定子树包含的节点,然后用树状数组来实现单点修改和区间查询就可以了,不过有些小细节需要注意一下。首先是会卡vector,开n个vector会超时,只能开一个二维vector才不会。另外记录dfs序后,在更新元素时是根据dfs序中的编号更新的,这点要注意一下。 #include<cstdio> #include<vector> #include<cstring> #include<iostream> #include<algorithm> using namespace std; typedef long long ll; #define ls rt << 1 #define rs rt << 1|1 #define mid ((l + r) >> 1) #define lson l, mid, ls #define rson mid + 1, r, rs const int maxn = 1e5 + 10; const int mod = 1e9 + 7; vector<vector<int> > e(100010); int L[maxn], R[maxn], c[maxn], vis[maxn]; int n, tot = 0; inline int lowbit(int i) { return (i & (-i)); } void add(int i, int x) { while(i <= n) { c[i] += x; i += lowbit(i); } } int ask(int i) { int ret = 0; while(i > 0) { ret += c[i]; i -= lowbit(i); } return ret; } void dfs(int u, int fa) { L[u] = ++tot; for(int i = 0; i < e[u].size(); ++i) { int v = e[u][i]; if(v == fa) continue; dfs(v, u); } R[u] = tot; } int main() { scanf("%d", &n); for(int i = 1; i <= n; ++i) add(i, 1); for(int i = 1; i < n; ++i) { int u, v; scanf("%d%d", &u, &v); e[u].push_back(v); e[v].push_back(u); } dfs(1, 0); int m; scanf("%d", &m); while(m--) { char s[2]; int x; scanf("%s%d", s, &x); if(s[0] == 'C') { int tmp = 1; vis[x] ^= 1; if(vis[x]) tmp = -1; x = L[x]; //这里要注意一下 add(x, tmp); } else if(s[0] == 'Q') { printf("%d\n", ask(R[x]) - ask(L[x] - 1)); } } return 0; }
相关 FZU 2277 Change(dfs序+树状数组) Problem Description There is a rooted tree with n nodes, number from 1-n. Root’s numb 待我称王封你为后i/ 2021年09月30日 13:00/ 0 赞/ 144 阅读
相关 A - Apple Tree dfs&树状数组|线段树 [![知识共享许可协议][80x15.png]][80x15.png 1] 本作品采用[知识共享署名-相同方式共享 4.0 国际许可协议][80x15.png 1]进行许可 ╰+哭是因爲堅強的太久メ/ 2021年11月01日 05:22/ 0 赞/ 166 阅读
相关 Apple Tree (树状数组+dfs序) Description There is an apple tree outside of kaka’s house. Every autumn, a lot of appl 雨点打透心脏的1/2处/ 2021年11月23日 13:31/ 0 赞/ 124 阅读
相关 POJ-2486 Apple Tree 树形DP 题意:一棵n个点的树,每个点有苹果数vi,每条边长度为1。从树根1出发,你不能走多于m步,走到一个点就能获得该点苹果,问能获得最多苹果是多少个? 解法:这道题想了挺久的还是没 朴灿烈づ我的快乐病毒、/ 2021年12月05日 04:41/ 0 赞/ 123 阅读
相关 Codeforces 1111E DP + 树状数组 + LCA + dfs序 题意:给你一颗树,有q次询问,每次询问给你若干个点,这些点可以最多分出m组,每组要满足两个条件:1:每组至少一个点,2:组内的点不能是组内其它点的祖先,问这样的分组能有多少个? 痛定思痛。/ 2021年12月12日 01:57/ 0 赞/ 131 阅读
相关 【树状数组】POJ 2352 Stars / @author johnsondu @time 2015-8-22 @type 忘是亡心i/ 2022年03月30日 12:43/ 0 赞/ 79 阅读
相关 ural 1018-Binary Apple Tree【树状DP】 1018. Binary Apple Tree Time limit: 1.0 second Memory limit: 64 MB Let's imagine h ゞ 浴缸里的玫瑰/ 2022年07月24日 09:06/ 0 赞/ 58 阅读
相关 POJ 3321-Apple Tree(树状数组) Apple Tree <table> <tbody> <tr> <td><strong>Time Limit:</strong> 2000MS</td> 心已赠人/ 2022年07月26日 08:46/ 0 赞/ 62 阅读
相关 【POJ3321】Apple Tree Apple Tree <table> <tbody> <tr> <td><strong>Time Limit:</strong> 2000MS</ 今天药忘吃喽~/ 2022年09月25日 09:20/ 0 赞/ 50 阅读
相关 POJ 3321-Apple Tree【树状数组+DFS序】 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果。卡卡很喜欢苹果。树上有N个节点,卡卡给他们编号1到N,根的编号永远是1.每个节点上最多结一个苹果。卡卡想要了解某一个子树上一共 朱雀/ 2023年08月17日 17:33/ 0 赞/ 389 阅读
还没有评论,来说两句吧...