#5 DIV2 A POJ 3321 Apple Tree 摘苹果 构建线段树
| Time Limit: 2000MS | Memory Limit: 65536K | |
| Total Submissions: 25232 | Accepted: 7503 |
Description
There is an apple tree outside of kaka's house. Every autumn, a lot of apples will grow in the tree. Kaka likes apple very much, so he has been carefully nurturing the big apple tree.
The tree has N forks which are connected by branches. Kaka numbers the forks by 1 to N and the root is always numbered by 1. Apples will grow on the forks and two apple won't grow on the same fork. kaka wants to know how many apples are there in a sub-tree, for his study of the produce ability of the apple tree.
The trouble is that a new apple may grow on an empty fork some time and kaka may pick an apple from the tree for his dessert. Can you help kaka?

Input
The first line contains an integer N (N ≤ 100,000) , which is the number of the forks in the tree.
The following N - 1 lines each contain two integers u and v, which means fork u and fork v are connected by a branch.
The next line contains an integer M (M ≤ 100,000).
The following M lines each contain a message which is either
"C x" which means the existence of the apple on fork x has been changed. i.e. if there is an apple on the fork, then Kaka pick it; otherwise a new apple has grown on the empty fork.
or
"Q x" which means an inquiry for the number of apples in the sub-tree above the fork x, including the apple (if exists) on the fork x
Note the tree is full of apples at the beginning
Output
Sample Input
3
1 2
1 3
3
Q 1
C 2
Q 1
Sample Output
3
2
Source
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <algorithm>
#include <set>
using namespace std;
typedef long long ll;
typedef unsigned long long Ull;
#define MM(a,b) memset(a,b,sizeof(a));
const double eps = 1e-10;
const int inf =0x7f7f7f7f;
const double pi=acos(-1);
const int maxn=100000+10; int dfs_clock=0,vis[4*maxn],s[4*maxn],e[4*maxn];
vector<vector<int> > G(4*maxn);
struct node{
int l,r,val,flag;
int mid(){
return (l+r)>>1;
}
}tree[4*maxn]; void push_up(int k)
{
tree[k].val=tree[2*k].val+tree[2*k+1].val;
} void build(int k,int l,int r)
{
tree[k].l=l;tree[k].r=r;
if(l==r) {tree[k].val=1;return;}
build(2*k,l,(l+r)/2);
build(2*k+1,(l+r)/2+1,r);
push_up(k);
} void dfs(int u)
{
dfs_clock++;
vis[u]=1;
s[u]=dfs_clock;
for(int i=0;i<G[u].size();i++)
{
int v=G[u][i];
if(vis[v]) continue;
dfs(v);
}
e[u]=dfs_clock;
} void update(int k,int pos)
{
if(tree[k].l==tree[k].r) {tree[k].val^=1;return;}
if(pos<=tree[k].mid()) update(2*k,pos);
else update(2*k+1,pos);
push_up(k);
} int query(int k,int l,int r)
{
if(l<=tree[k].l&&tree[k].r<=r)
return tree[k].val;
else if(tree[k].r>=l&&tree[k].l<=r)
{
int res=0;
res+=query(2*k,l,r);
res+=query(2*k+1,l,r);
return res;
}
else return 0;
} int main()
{
int n,m;
while(~scanf("%d",&n))
{
MM(vis,0);
for(int i=1;i<=n;i++) G[i].clear();
for(int i=1;i<=n-1;i++)
{
int u,v;
scanf("%d %d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
dfs_clock=0;
dfs(1);
build(1,1,n); scanf("%d",&m);
for(int i=1;i<=m;i++)
{
char a[3];int x;
scanf("%s %d",a,&x);
if(a[0]=='Q') printf("%d\n",query(1,s[x],e[x]));
else update(1,s[x]);
}
}
return 0;
}
分析:线段树很好的一道题,比赛的时候想到了单点更新维护区间和,所以应该要线段树或BIT,但是
这棵树连二叉树都不是,就不知道怎么维护了,,,,这也是这道题的精华所在,首先dfs一次,依据
时间戳,得出每个节点维护的区间,这样子节点维护的区间必然被父节点包含,然后就是常规的线段树了,
单点更新时就只要更新该点所在时间戳的那个点,这样包含该点的区间的值也会相应修改,查询某点
及其子树的值,就只要查询这个点对应的区间就好,神奇的一题
#5 DIV2 A POJ 3321 Apple Tree 摘苹果 构建线段树的更多相关文章
- POJ 3321 Apple Tree(DFS序+线段树单点修改区间查询)
Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 25904 Accepted: 7682 Descr ...
- POJ 3321 Apple Tree dfs+二叉索引树
题目:http://poj.org/problem?id=3321 动态更新某个元素,并且求和,显然是二叉索引树,但是节点的标号不连续,二叉索引树必须是连续的,所以需要转化成连续的,多叉树的形状已经建 ...
- POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)
POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和) 题意分析 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根 ...
- POJ - 3321 Apple Tree (线段树 + 建树 + 思维转换)
id=10486" target="_blank" style="color:blue; text-decoration:none">POJ - ...
- POJ 3321 Apple Tree 【树状数组+建树】
题目链接:http://poj.org/problem?id=3321 Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submiss ...
- ACM学习历程——POJ3321 Apple Tree(搜索,线段树)
Description There is an apple tree outside of kaka's house. Every autumn, a lot of apples will ...
- poj 3321:Apple Tree(树状数组,提高题)
Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 18623 Accepted: 5629 Descr ...
- poj 3321 Apple Tree dfs序+线段树
Apple Tree Time Limit: 2000MS Memory Limit: 65536K Description There is an apple tree outsid ...
- (简单) POJ 3321 Apple Tree,树链剖分+树状数组。
Description There is an apple tree outside of kaka's house. Every autumn, a lot of apples will grow ...
随机推荐
- [转帖]U盘安装centos 的方法
通过U盘或CD/DVD装centos7,出现“dracut-initqueue timeout..."解决办法 1.在用CD/DVD挂载centos7镜像安装系统时,出现“dracut- ...
- Windows 2016 安装单机版本Oracle ASM 的简单说明
发现这样弄完 启动之后 就挂了 真蛋疼. 改天再研究一下. 1. 需要给磁盘处理一下 建议使用压缩卷的模式进行处理 如图示 需要新建简单卷 注意设置 然后不进行格式化 2. 然后安装oracle的g ...
- Ubuntu-虚拟机-忘记登陆密码
前提 在我们使用Ubuntu虚拟机的过程中,偶尔会出现密码忘了的尴尬事情.里面又有重要资料,不能重新安装,这时我们要重置密码,接下来,让我们共同学习! 重启虚拟机-重启时按住 shift 会出现以下 ...
- 客户端实现WebService服务接口
首先,要获得搭建好的WebService服务的WSDL,如要实现国内手机号码归属地查询WEB服务,其WSDL为:http://ws.webxml.com.cn/WebServices/MobileCo ...
- JavaSE--jdbc编程
JDBC全称为:Java Data Base Connectivity (java数据库连接),可以为多种数据库提供统一的访问.JDBC是sun开发的一套数据库访问编程接口,是一种SQL级的API.它 ...
- SQL学习(三)之子句和函数
函数 COUNT()/计数.MIN()/最小值.MAX()/最大值.AVG()/平均值.SUM()/和 子句 子句是语句的一部分包括WHERE.GROUP.ORDER.LIMIT WHERE:条件 G ...
- luogu题解 UVA534 【Frogger--最小瓶颈边
题目链接: https://www.luogu.org/problemnew/show/UVA534 Update 6.18 多点对最短瓶颈路算法:https://www.cnblogs.com/Ry ...
- snappy-java两种压缩方式的区别
1.Snappy-java项目地址 https://github.com/xerial/snappy-java 2.Snappy-java两种压缩方式 使用Snappy.compress进行压缩 St ...
- 《HTML、CSS、Javascript网页制作,从入门到精通》——第一章 HTML基础,第二章HTML基本标记
1)HTML的基本概念 HTML就一种描述性的标记语言,是文档的超文本标记语言. 基本结构为: HTML标记组成 : <标记元素> 源文件中标记是不区分大小写的. 2)编写方法: 1&g ...
- java并发编程:锁的相关概念介绍
理解同步,最好先把java中锁相关的概念弄清楚,有助于我们更好的去理解.学习同步.java语言中与锁有关的几个概念主要是:可重入锁.读写锁.可中断锁.公平锁 一.可重入锁 synchronized和R ...