树标号

Apple Tree http://poj.org/problem?id=3321

 1 #include<cstdio>
 2 #include<cstring>
 3 #define mt(a,b) memset(a,b,sizeof(a))
 4 #define lrrt int L,int R,int rt
 5 #define iall 1,n,1
 6 #define imid int mid=(L+R)>>1
 7 #define lson L,mid,rt<<1
 8 #define rson mid+1,R,rt<<1|1
 9 using namespace std;
10 const int M=100010;
11 int tree[M<<2];
12 void pushup(int rt){
13     tree[rt]=tree[rt<<1]+tree[rt<<1|1];
14 }
15 void build(lrrt){
16     if(L==R){
17         tree[rt]=1;
18         return ;
19     }
20     imid;
21     build(lson);
22     build(rson);
23     pushup(rt);
24 }
25 void update(int x,lrrt){
26     if(L==R){
27         tree[rt]^=1;
28         return ;
29     }
30     imid;
31     if(mid>=x) update(x,lson);
32     else       update(x,rson);
33     pushup(rt);
34 }
35 int query(int x,int y,lrrt){
36     if(x<=L&&R<=y) return tree[rt];
37     imid;
38     int ans=0;
39     if(mid>=x) ans+=query(x,y,lson);
40     if(mid<y)  ans+=query(x,y,rson);
41     return ans;
42 }
43 struct G{
44     struct E{
45         int u,v,next;
46     }e[M<<1];
47     int le,head[M];
48     void init(){
49         le=0;
50         mt(head,-1);
51     }
52     void add(int u,int v){
53         e[le].u=u;
54         e[le].v=v;
55         e[le].next=head[u];
56         head[u]=le++;
57     }
58 }g;
59 struct Node{
60     int l,r;
61 }node[M];
62 int Index;
63 void dfs(int u,int fa){
64     node[u].l=++Index;
65     for(int i=g.head[u];~i;i=g.e[i].next){
66         int v=g.e[i].v;
67         if(v!=fa){
68             dfs(v,u);
69         }
70     }
71     node[u].r=Index;
72 }
73 int main(){
74     int n,m;
75     while(~scanf("%d",&n)){
76         g.init();
77         for(int i=0,u,v;i<n-1;i++){
78             scanf("%d%d",&u,&v);
79             g.add(u,v);
80             g.add(v,u);
81         }
82         build(iall);
83         Index=0;
84         dfs(1,-1);
85         scanf("%d",&m);
86         while(m--){
87             char op[4];
88             int x;
89             scanf("%s%d",op,&x);
90             if(op[0]==‘C‘){
91                 update(node[x].l,iall);
92             }
93             else{
94                 printf("%d\n",query(node[x].l,node[x].r,iall));
95             }
96         }
97     }
98     return 0;
99 }

树标号

时间: 2024-10-01 02:34:11

树标号的相关文章

HDU 5052 Yaoge’s maximum profit 裸树链剖分 2014 ACM/ICPC Asia Regional Shanghai Online

题意: 给定n个点的带点权树. 下面n行给出每个点点权表示每个点买卖鸡腿的价格 下面n-1行给出树边 下面Q个操作 Q行 u, v, val 从u走到v,过程中可以买一个鸡腿,然后到后面卖掉,输出max(0, 最大的收益) 然后给[u,v]路径上点点权+=val 思路: 树链剖分裸题 屌丝题解:点击打开链接 #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include &

Spoj 6779 Can you answer these queries VII 树链剖分 在树上任意路径的最大子段和 区间修改点权

题目链接:点击打开链接 题意: rt.. 在询问时,两端向上爬时记录从深度浅的到深度深的方向上的 (也就是左最大连续子段和) 最后两个点在同一条重链上时合并. 合并时要注意有4种情况, 详见代码. 线段树部分和5相似. #include <cstdio> #include <iostream> #include <string.h> #include <vector> using namespace std; inline void rd(int &

2016&quot;百度之星&quot; - 初赛(Astar Round2A)

http://acm.hdu.edu.cn/showproblem.php?pid=5692 题意:给一棵树,点有权值. 操作1:询问从0点出发,经过x点(输入)的路径中,点权和最大的路径的和是多少. 操作2:将x号点的值更新为y. 思路:已0为根形成一个有根树,经过x点的所有路径的终点都在已x为根的子树中,问题相当于求一颗子树中的所有节点到0点的距离最大值,将题目的点权理解成距离. 解法:用dfs顺序对0为根的树标号,按照标号作为线段树的序号,那么某一颗子树的点在线段树的区间也是连续的了,这是

TreeSegment1151

给你n个矩形,每个矩形给出左下点的坐标,右上点的坐标.最后以n=0为结束.要你求出矩形并后的面积. 假设从上到下四条线段的Y值为y1,y2,y3,y4,他们的宽度各位d1,d2,d3,d4.那么首先从上到下扫描第一条线段,此时投影到红色线条的长度为d1,于是面积是(y2-y1)*d1(右图紫色区域),之后扫描第二条线,投影到红色线条的长度并不仅仅是d1+d2,两者存在重叠,这时利用线段树,求助所有线段的投影长度再乘以(y3-y2)即是中间蓝色区域的面积. 扫描第三条线的时候,其实是矩形的底边,这

uva 1436 - Counting heaps(计数)

题目链接:uva 1436 - Counting heaps 题目大意:给出一个树的形状,现在为这棵树标号,保证根节点的标号值比子节点的标号值大,问有多少种标号树. 解题思路:和村名排队的思路是一只的uva11174,最后问题只和树德结构有直接关系,f(root)=(s(root)?1)!(s(1)?s(2)???s(n) 但是给定的取模数不是质数,所以不能用逆元做,只能将分子分母分别拆分成质因子,然后对质因子进制约分.因为最后的答案一定是正整数,所以对于每个质因子,分子分解出的因子个数一定大于

【POJ 3321】 Apple Tree (dfs重标号设区间+树状数组求和)

[POJ 3321] Apple Tree (dfs重标号设区间+树状数组求和) Apple Tree Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 21966   Accepted: 6654 Description There is an apple tree outside of kaka's house. Every autumn, a lot of apples will grow in the tree. K

HDU1556Color the ball【标号法||树状数组】

大意: N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色.但是N次以后lele已经忘记了第I个气球已经涂过几次颜色了,你能帮他算出每个气球被涂过几次颜色吗? Input 每个测试实例第一行为一个整数N,(N <= 100000).接下来的N行,每行包括2个整数a b(1 <= a <= b <= N). 当N = 0,输入结束. Out

无标号树的计数原理(组合计数,背包问题,隔板法,树的重心)

闲话 一个计数问题入门级选手来搞这种东西 最初的动力来自高一化学课有机物(滑稽).<同步导练>出了个这样的选择题. 一个结构极其庞大的烷烃(二十几个碳原子),求它的主链长度. 这不是个求树的直径的裸题么?!OI选手扫两眼就出来了,然而别的同学费劲心思找完了还是错的. 于是第一次在常规课中体验到作为OIer的优越感...... 又是一节课,芙蓉姐开始要我们画己烷.庚烷的同分异构体?! 这不是等于要求节点数为\(n\),点度数不超过\(4\)的无标号的无根树个数吗?没见过,但还是有一点DP思想,蒟

(POJ 3067) Japan (慢慢熟悉的树状数组)

Japan Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 29295   Accepted: 7902 Description Japan plans to welcome the ACM ICPC World Finals and a lot of roads must be built for the venue. Japan is tall island with N cities on the East coas