POJ 3321 DFS序+线段树
单点修改树中某个节点,查询子树的性质.DFS序 子树序列一定在父节点的DFS序列之内,所以可以用线段树维护.
1: /*
2: DFS序 +线段树
3: */
4:
5: #include <cstdio>
6: #include <cstring>
7: #include <cctype>
8: #include <algorithm>
9: #include <vector>
10: #include <iostream>
11: using namespace std;
12:
13: #define LL(a) a<<1
14: #define RR(a) a<<1|1
15:
16: const int MaxL = 200002;
17:
18: int pre[MaxL]; // first travel
19: int nxt[MaxL]; // nxt travel
20: bool vis[MaxL];
21: int N;
22: vector<vector<int> > E(MaxL);
23:
24: struct Seg_tree
25: {
26: int left, right;
27: int sum;
28: } tt[MaxL<<2];
29:
30:
31: void PushUp(int idx)
32: {
33: tt[idx].sum = tt[LL(idx)].sum + tt[RR(idx)].sum;
34: }
35:
36: void build(int l,int r,int idx)
37: {
38: tt[idx].left = l, tt[idx].right = r;
39: tt[idx].sum = r-l+1;
40: if (l == r) return ;
41: int m = (l + r) >> 1;
42: build(l,m, LL(idx));
43: build(m+1, r, RR(idx));
44: }
45:
46: void update(int p, int idx = 1)
47: {
48: if(p == tt[idx].left && p == tt[idx].right)
49: {
50: tt[idx].sum ^=1;
51: return ;
52: }
53: int mid = (tt[idx].left + tt[idx].right)>>1;
54: if(p <= mid) update(p, LL(idx));
55: else update(p, RR(idx));
56: PushUp(idx);
57: }
58:
59: int query(int l, int r, int idx = 1)
60: {
61: if(l == tt[idx].left && r ==tt[idx].right)
62: return tt[idx].sum;
63: int mid = (tt[idx].left + tt[idx].right)>>1;
64: if(r <= mid) return query(l,r, LL(idx));
65: else if(l> mid) return query(l,r, RR(idx));
66: else
67: return query(l, mid, LL(idx))+ query(mid+1, r, RR(idx));
68: }
69:
70: int mark = 1;
71: void dfs( int a)
72: {
73: vis[a] = 1;
74: pre[a] = mark++;
75: for(int i=0; i<E[a].size(); i++)
76: {
77: if(!vis[E[a][i]])
78: dfs(E[a][i]);
79: }
80: nxt[a] = mark++;
81: }
82: int main()
83: {
84: // freopen("1.txt","r",stdin);
85: memset(pre, 0, sizeof(pre));
86: memset(nxt, 0 ,sizeof(nxt));
87: memset(vis, 0 ,sizeof(vis));
88:
89: scanf("%d", &N);
90: for(int i=1; i<N; i++)
91: {
92: int a,b;
93: scanf("%d%d", &a,&b);
94: E[a].push_back(b);
95: E[b].push_back(a);
96: }
97: dfs(1);
98:
99: N*=2;
100: build(1, N, 1);
101: int M;
102: scanf("%d", &M);
103: for(int i=1; i<=M; i++)
104: {
105: char c;
106: int a;
107: scanf("%s", &c);
108: scanf("%d",&a);
109: if(c =='Q')
110: {
111: cout<<query(pre[a],nxt[a], 1) /2<<endl;
112: }
113: else
114: {
115: update(pre[a],1);
116: update(nxt[a],1);
117: }
118: }
119: return 0;
120: }
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
POJ 3321 DFS序+线段树的更多相关文章
- POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)
POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和) 题意分析 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根 ...
- dfs序线段树
dfs序+线段树,啥?如果在一棵树上,需要你修改一些节点和查询一些节点,如果直接dfs搜的话肯定超时,那用线段树?树结构不是区间啊,怎么用?用dfs序将树结构转化为一个区间,就能用线段树进行维护了. ...
- Educational Codeforces Round 6 E dfs序+线段树
题意:给出一颗有根树的构造和一开始每个点的颜色 有两种操作 1 : 给定点的子树群体涂色 2 : 求给定点的子树中有多少种颜色 比较容易想到dfs序+线段树去做 dfs序是很久以前看的bilibili ...
- 【BZOJ-3252】攻略 DFS序 + 线段树 + 贪心
3252: 攻略 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 339 Solved: 130[Submit][Status][Discuss] D ...
- Codeforces 343D Water Tree(DFS序 + 线段树)
题目大概说给一棵树,进行以下3个操作:把某结点为根的子树中各个结点值设为1.把某结点以及其各个祖先值设为0.询问某结点的值. 对于第一个操作就是经典的DFS序+线段树了.而对于第二个操作,考虑再维护一 ...
- BZOJ2434 [Noi2011]阿狸的打字机(AC自动机 + fail树 + DFS序 + 线段树)
题目这么说的: 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母.经阿狸研究发现,这个打字机是这样工作的: 输入小 ...
- 【XSY2667】摧毁图状树 贪心 堆 DFS序 线段树
题目大意 给你一棵有根树,有\(n\)个点.还有一个参数\(k\).你每次要删除一条长度为\(k\)(\(k\)个点)的祖先-后代链,问你最少几次删完.现在有\(q\)个询问,每次给你一个\(k\), ...
- F - Change FZU - 2277 (DFS序+线段树)
题目链接: F - Change FZU - 2277 题目大意: 题意: 给定一棵根为1, n个结点的树. 有q个操作,有两种不同的操作 (1) 1 v k x : a[v] += x, a[v ' ...
- BZOJ4551[Tjoi2016&Heoi2016]树——dfs序+线段树/树链剖分+线段树
题目描述 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为1),有以下 两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记,其他结点均 ...
随机推荐
- Win10 VMware虚拟机无法打开内核设备“\\.\Global\vmx86“
前几项与Win7配置相同 用管理员模式打开CMD 运行 net start vmci net start vmx86 net start VMnetuserif 这三条命令 为了不用每次启动都这样,修 ...
- tornado 信号处理
一般情况下,对于线上的程序,我们是不能采取kill -9 来杀掉进程的 因为程序可能有未处理完的程序,如果贸然采取kill -9可能会导致数据不一致 如果需要关闭程序怎么办呢,一般情况下我们采取信号技 ...
- CentOS 7 minimal 版本安装后网络配置
本博文主要为你讲解如何再CentOS 7中启用网络. 1.首先使用root登录服务器,输入 nmcli d 我们发现网卡是处于禁用状态. 2.打开网络管理器界面,再终端输入 nmtui 打开界面如上, ...
- 【转】https,https的本地测试环境搭建,asp.net结合https的代码实现,http网站转换成https网站之后遇到的问题
正需要这个,写的很好,就转过来了 转自: http://www.cnblogs.com/naniannayue/ 一:什么是https SSL(Security Socket Layer)全称 ...
- Stimulsoft Reports筛选数据来绑定显示2个报表
今天用Stimulsoft Reports做报表的时候,遇到一个问题,需要一个报表中显示2个报表视图,我在百度和博客园中搜索了一下,发现这方面的资料很少,我自己最后把问题解决了之后,整理了一下给大家分 ...
- SQL IDENTITY(int,1,1) 用法
select IDENTITY(int,1,1) as SortID from tb_order 仅当 SELECT 语句中有 INTO 子句时,才能使用 IDENTITY 函数. select ID ...
- HTML的FORM的元素
form是是HTML的一个重要元素. form的常用控件有 单行文本框<input type="text" value="text" name=" ...
- iOS数据持久化(三)
#pragma mark - Core Data stack /** * @synthesize 关联成员变量和属性 */ @synthesize managedObjectContext = _ma ...
- 20141031--SQL分组,数学函数,聚合函数
/* 通过代码操作:创建一个数据库,里面有一个学生信息表, 内容包括:学号,姓名,性别,体重,年龄,语数外三门课分数,班级 插入20条数据 执行以下查询操作: 1.查姓王的同学的信息 2.分别查每门课 ...
- 20140912-.NET平台技术思维导图
前段时间在网上看到的一张图,忘记出处了.