codeforces 877-E

题目链接:codeforces 877-E


题目大意:一棵树上,有些灯亮着,有些灯暗的,我们每次可以查询某个节点的亮灯个数,或者改变某个子树的暗亮情况(暗变成亮,亮变成暗)。


比较简单的dfs序,然后用线段树区间亮的个数即可。


AC代码:

#pragma GCC optimize(2)
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=2e5+10;
int n,q,cnt,st[N],ed[N],a[N];
int head[N],nex[N],to[N],tot;
struct node{
	int l,r,sum,lazy;
}t[N<<2];
inline void add(int a,int b){
	to[++tot]=b; nex[tot]=head[a]; head[a]=tot;
}
void dfs(int x){
	st[x]=++cnt;
	for(int i=head[x];i;i=nex[i])	dfs(to[i]);
	ed[x]=cnt;
}
inline void push_up(int p){
	t[p].sum=t[p<<1].sum+t[p<<1|1].sum;
}
inline void push_down(int p){
	if(t[p].lazy){
		t[p<<1].lazy^=1;	t[p<<1|1].lazy^=1;
		t[p<<1].sum=(t[p<<1].r-t[p<<1].l+1-t[p<<1].sum);
		t[p<<1|1].sum=(t[p<<1|1].r-t[p<<1|1].l+1-t[p<<1|1].sum);
		t[p].lazy=0;
	}
}
void build(int p,int l,int r){
	t[p].l=l;	t[p].r=r;
	if(l==r)	return ;	int mid=l+r>>1;
	build(p<<1,l,mid);	build(p<<1|1,mid+1,r);
}
void updata(int p,int x){
	if(t[p].l==t[p].r){
		t[p].sum=1;	return ;
	}
	int mid=t[p].l+t[p].r>>1;
	if(x<=mid)	updata(p<<1,x);
	else	updata(p<<1|1,x);
	push_up(p);
}
void change(int p,int l,int r){
	if(t[p].l==l&&t[p].r==r){
		t[p].lazy^=1;	t[p].sum=(r-l+1-t[p].sum);	return ;
	}
	push_down(p);	int mid=t[p].l+t[p].r>>1;
	if(r<=mid)	change(p<<1,l,r);
	else if(l>mid)	change(p<<1|1,l,r);
	else	change(p<<1,l,mid),change(p<<1|1,mid+1,r);
	push_up(p);
}
int ask(int p,int l,int r){
	if(t[p].l==l&&t[p].r==r)	return t[p].sum;
	push_down(p);	int mid=t[p].l+t[p].r>>1;
	if(r<=mid)	return ask(p<<1,l,r);
	else if(l>mid)	return ask(p<<1|1,l,r);
	else	return ask(p<<1,l,mid)+ask(p<<1|1,mid+1,r);
}
signed main(){
	scanf("%d",&n);
	for(int i=2;i<=n;i++){
		int x;	scanf("%d",&x);	add(x,i);
	}
	dfs(1);	build(1,1,n);
	for(int i=1;i<=n;i++){
		int x;	scanf("%d",&x);	if(x)	updata(1,st[i]);
	}
	scanf("%d",&q);	char op[5];	int x; 
	while(q--){
		scanf("%s %d",op,&x);
		if(op[0]=='g')	printf("%d\n",ask(1,st[x],ed[x]));
		else	change(1,st[x],ed[x]);
	}
	return 0;
}
全部评论

相关推荐

未知的命运:大佬这都找不到我还找啥啊
点赞 评论 收藏
分享
来,说点可能被同行“骂”的大实话。🙊当初接数字马力Offer时,朋友都说:“蚂蚁的“内包”公司?你想清楚啊!”但入职快一年后的今天,我反而对他有了不一样的看法!🔹&nbsp;是偏见?还是信息差!之前没入职之前外面都在说什么岗位低人一等这类。实际上:这种情况不可至否,不能保证每个团队都是其乐融融。但我在的部门以及我了解的周边同事都还是十分好相处的~和蚂蚁师兄师姐之间也经常开一些小玩笑。总之:身份是蚂蚁公司给的,地位是自己挣的(一个傲娇女孩的自述)。🔹&nbsp;待遇?玩的就是真实!试用期工资全额发!六点下班跑得快(早9晚6或者早10晚7,动态打卡),公积金顶格交。别听那些画饼的,到手的钱和下班的时间才是真的(都是牛马何必难为牛马)。🔹&nbsp;能不能学到技术?来了就“后悔”!我们拥有权限直通蚂蚁知识库,技术栈多到学不完。说“学不到东西”的人,来了可能后悔——后悔来晚了(哈哈哈哈,可以不学但是不能没有)!💥&nbsp;内推地址:https://app.mokahr.com/su/ueoyhg❗我的内推码:NTA6Nvs走我的内推,可以直达业务部门,面试流程更快速,进度可查!今天新放HC,之前挂过也能再战!秋招已经正式开始啦~机会就摆在这,敢不敢来试一试呢?(和我一样,做个勇敢的女孩)
下午吃泡馍:数字马力的薪资一般哇,5年经验的java/测试就给人一万出头,而且刚入职第三天就让人出差,而且是出半年
帮你内推|数字马力 校招
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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