[线段树] Apple Tree POJ - 3321 对树的处理 dfs建序

http://poj.org/problem?id=3321
题意 给你一颗树 Q是查询某个结点带他子树 的和 C 是改变树上结点 原来是0 变为1 原来1变为0

这样只需要 与或运算 ^ 就好了 而且单点更新 区间查询 水题
这道题重点是DFS对树建序 这样就可以更方便维护树和子树了
这里我DFS建序维护的是 结点应该管理的区间左右结点的序号

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <list> 
using namespace std;
typedef long long ll;

const int maxe = 1e6+5;
const int maxv = 100000+100;
const int maxn = 100000+100;
const int mod = 1000000 ;
const int INF = 0x3f3f3f3f;
const double PI=acos(-1.0);
const int cx[]={0,0,1,-1};
const int cy[]={1,-1,0,0};

int n,m,id=1,st,ed;

int tree[maxv<<4];
struct node{
	int l,r;
}point[maxn];// 结点管理的左右区间

int head[maxn],v[maxn],nxt[maxn],cnt;
void add(int u,int vi){
	nxt[++cnt]=head[u];
	v[cnt]=vi;
	head[u]=cnt;
}

void dfs(int x){
	point[x].l=++id;
	for(int i=head[x];i!=-1;i=nxt[i]){
		dfs(v[i]);
	}
	point[x].r=id;
}

void build(int l,int r,int rt){
	if(l==r){
		tree[rt]=1;
		return ;
	}
	int mid=(l+r)>>1;
	if(l<=mid) build(l,mid,rt<<1);
	if(mid<r) build(mid+1,r,rt<<1|1);
	tree[rt]=tree[rt<<1]+tree[rt<<1|1];
}

void updata(int L,int l,int r,int rt){
	if(l==r){
		tree[rt]^=1;
		return ;
	}
	int mid=(l+r)>>1;
	if(mid>=L) updata(L,l,mid,rt<<1);
	else updata(L,mid+1,r,rt<<1|1);
	tree[rt]=tree[rt<<1]+tree[rt<<1|1]; 
}

int query(int L,int R,int l,int r,int rt){
// cout<<L<<" "<<R<<" "<<l<<" "<<r<<" "<<rt<<endl; 
	if(L<=l&&R>=r){
		return tree[rt];
	}
	int res=0;
	int mid=(l+r)>>1;
	if(L<=mid) res+=query(L,R,l,mid,rt<<1);
	if(R>mid) res+=query(L,R,mid+1,r,rt<<1|1);
	return res;
}

int main(){
	while(~scanf("%d",&n)){
		memset(head,-1,sizeof(head));
		memset(v,0,sizeof(v));
		cnt=-1;
		id=0;
		memset(nxt,-1,sizeof(nxt));
		memset(point,0,sizeof(point)); 
		for(int i=1;i<n;i++){
			scanf("%d %d",&st,&ed);
			add(st,ed);
		}
		dfs(1);
// for(int i=1;i<=10;i++){
// cout<<point[i].l<<" "<<point[i].r<<endl;
// }
		build(1,n,1);
		scanf("%d",&m);
		char ch;
		for(int i=0;i<m;i++){
			getchar();
			scanf("%c %d",&ch,&st);
			if(ch=='Q'){
				printf("%d\n",query(point[st].l,point[st].r,1,n,1));
			}
			else{
				updata(point[st].l,1,n,1);
			}
		}
		
	}
    return 0;
}
全部评论

相关推荐

02-07 12:06
已编辑
华侨大学 测试开发
最近看到很多&nbsp;92&nbsp;的,甚至是硕士,开始往测开赛道卷,说实话有点看不懂。先把话说清楚,大厂里的测开,绝大多数时间干的还是测试的活,只是写点自动化脚本、维护测试平台、接接流水线,真正像开发一样做系统、做架构、做核心平台的测开少得可怜,基本都集中在核心提效组,而且人很少,外面进去的大概率轮不到你,我想真正干过人都清楚。很多人被洗脑了,以为测开也是开,和后端差不多,只是更简单、更轻松、还高薪。现实情况是,测开和开发的职业路径完全不一样。开发的核心是业务和系统能力,测开的核心是稳定性和覆盖率,前者是往上走,后者天花板非常明显。你可以见到很多开发转测开,但你很少见到干了几年测开还能顺利转回开发的。更现实一点说,92&nbsp;的高学历如果拿来做测开,大部分时间就是在做重复性很强的杂活,这种工作对个人能力的放大效应非常弱。三年下来,你和一个双非的,甚至本科的测开差距不会太大,但你和同龄的后端、平台开发差距会非常明显。这不是努不努力的问题,是赛道问题。所谓测开简单高薪,本质上是把极少数核心测开的上限,当成了整个岗位的常态来宣传。那些工资高、技术强的测开,本身就是开发水平,只是挂了个测开的名。普通人进去,99%&nbsp;做的都是项目兜底型工作,而不是你想象中的平台开发。测开不是不能做,但它绝对不是开发的平替,也不是性价比最优解。如果你是真的不想做开发,追求稳定,那测开没问题。但如果你只是觉得测开比后端容易,还能进大厂,那我劝你冷静一点,这只是在用短期安全感换长期天花板。有92的学历,如果你连测开这些重复性工作都能心甘情愿接受,那你把时间精力用在真正的开发、系统、业务深度上,回报大概率比卷测开要高得多。想清楚再下场,别被岗位名和话术带偏了,就算去个前端客户端也是随便占坑的,测开是一个坑位很少赛道,反而大面积学历下放,不用想也能知道会是什么结果,我想各位在JAVA那里已经看到了
小浪_Coding:工作只是谋生的手段 而不是相互比较和歧视
点赞 评论 收藏
分享
bg双非本科,方向是嵌入式。这次秋招一共拿到了&nbsp;8&nbsp;个&nbsp;offer,最高年包&nbsp;40w,中间也有一段在海康的实习经历,还有几次国家级竞赛。写这篇不是想证明什么,只是想把自己走过的这条路,尽量讲清楚一点,给同样背景的人一个参考。一、我一开始也很迷茫刚决定走嵌入式的时候,其实并没有一个特别清晰的规划。网上的信息很零散,有人说一定要懂底层,有人说项目更重要,也有人建议直接转方向。很多时候都是在怀疑:1.自己这种背景到底有没有机会2.现在学的东西到底有没有用3.是不是已经开始晚了这些问题,我当时一个都没答案。二、现在回头看,我主要做对了这几件事第一,方向尽早确定,但不把自己锁死。我比较早就确定了嵌入式这个大方向,但具体做哪一块,是在项目、竞赛和实习中慢慢调整的,而不是一开始就给自己下结论。第二,用项目和竞赛去“证明能力”,而不是堆技术名词。我不会刻意追求学得多全面,而是确保自己参与的每个项目,都能讲清楚:我负责了什么、遇到了什么问题、最后是怎么解决的。第三,尽早接触真实的工程环境。在海康实习的那段时间,对我触动挺大的。我开始意识到,企业更看重的是代码结构、逻辑清晰度,以及你能不能把事情说清楚,而不只是会不会某个知识点。第四,把秋招当成一个需要长期迭代的过程。简历不是一次写完的,面试表现也不是一次就到位的。我会在每次面试后复盘哪些问题没答好,再针对性补。三、我踩过的一些坑现在看也挺典型的:1.一开始在底层细节上纠结太久,投入产出比不高2.做过项目,但前期不会总结,导致面试表达吃亏3.早期有点害怕面试,准备不充分就去投这些弯路走过之后,才慢慢找到节奏。四、给和我背景相似的人一点建议如果你也是双非,准备走嵌入式,我觉得有几件事挺重要的:1.不用等“准备得差不多了”再投2.项目一定要能讲清楚,而不是做完就算3.不要只盯着技术,多关注表达和逻辑很多时候,差的不是能力,而是呈现方式。五、写在最后这篇总结不是标准答案,只是我个人的一次复盘。后面我会陆续把自己在嵌入式学习、竞赛、实习和秋招中的一些真实经验拆开来讲,希望能对后来的人有点帮助。如果你正好也在这条路上,希望你能少走一点弯路。
x_y_z1:蹲个后续
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务