Codeforces Round #442 (Div. 2) E Danil and a Part-time Job (dfs序加上一个线段树区间修改查询)
题意:
给出一个具有N个点的树,现在给出两种操作:
1.get x,表示询问以x作为根的子树中,1的个数。
2.pow x,表示将以x作为根的子树全部翻转(0变1,1变0).
思路:dfs序加上一个线段树区间修改查询。
AC代码:
#include<iostream>
#include<vector>
#include<string.h>
using namespace std;
const int maxn=2e5+5;
int sum[maxn<<2],lazy[maxn<<2],a[maxn],num[maxn],lft[maxn],rght[maxn],tot;
char s[10];
vector<int>map[maxn];
void build(int k,int l,int r){
if(l==r){
sum[k]=a[num[l]];
return ;
}
int mid=(l+r)/2;
build(k*2,l,mid);
build(k*2+1,mid+1,r);
sum[k]=sum[k*2]+sum[k*2+1];
}
void pushdown(int k,int l,int r){
if(lazy[k]){
int mid=(l+r)/2;
sum[k*2]=mid-l+1-sum[k*2];
sum[k*2+1]=r-mid-sum[k*2+1];
//sum[k]=sum[k*2]+sum[k*2+1];
lazy[k*2]^=1;
lazy[k*2+1]^=1;
lazy[k]=0;
}
}
void update(int k,int l,int r,int L,int R){
if(L<=l&&r<=R){
sum[k]=r-l+1-sum[k];
lazy[k]^=1;
return;
}
pushdown(k,l,r);
int mid=(l+r)/2;
if(mid>=L)update(k*2,l,mid,L,R);
if(mid<R)update(k*2+1,mid+1,r,L,R);
sum[k]=sum[k*2]+sum[k*2+1];
return ;
}
int query(int k,int l,int r,int L,int R){
if(L<=l&&r<=R)return sum[k];
int ans=0;
pushdown(k,l,r);
int mid=(l+r)/2;
if(mid>=L)ans+=query(k*2,l,mid,L,R);
if(mid<R)ans+=query(k*2+1,mid+1,r,L,R);
//sum[k]=sum[k*2]+sum[k*2+1];
return ans;
}
//pushdown和query的pushup可以不要,但是在update中pushdown之后需要pushup
void dfs(int k){
lft[k]=++tot;
for(int i=0;i<map[k].size();i++){
dfs(map[k][i]);
}
rght[k]=tot;
}
//每个点的left序号就是在线段树中的序号
//每个点对应的left[i]-right[i]+1就是每个点的字节点的个数(加上自己)
int main(){
int n,x;
while(cin>>n){
for(int i=1;i<=n;i++)map[i].clear();
for(int i=2;i<=n;i++){
cin>>x;
map[x].push_back(i);
}
memset(sum,0,sizeof(sum));
memset(lazy,0,sizeof(lazy));
tot=0;
dfs(1);
/*for(int i=1;i<=n;i++){
cout<<lft[i]<<' '<<rght[i]<<endl;
}*/
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
num[lft[i]]=i;
//每个点在线段树中的序号和本身不是一样的
//注意看build函数
}
build(1,1,n);
int q;
cin>>q;
for(int i=0;i<q;i++){
cin>>s>>x;
if(s[0]=='p'){
update(1,1,n,lft[x],rght[x]);
}
else cout<<query(1,1,n,lft[x],rght[x])<<endl;
}
}
return 0;
}

圆圈中的数字是每个节点的left值,每个点的right值就是每个点的子节点中left最大的那个
该图对应输入
10
1 2 3 4 2 4 1 7 8
1 1 0 1 1 0 0 0 1 1
10
pow 1
get 2
pow 2
pow 8
get 6
pow 6
pow 10
get 6
pow 8
pow 3
输出 3 0 1
(第一次看dfs序,看了好久才明白,还耽误了吴老狗睡觉的时间T^T,还是太菜了)
Codeforces Round #442 (Div. 2) E Danil and a Part-time Job (dfs序加上一个线段树区间修改查询)的更多相关文章
- Codeforces Round #169 (Div. 2) E. Little Girl and Problem on Trees dfs序+线段树
E. Little Girl and Problem on Trees time limit per test 2 seconds memory limit per test 256 megabyte ...
- Codeforces Round #442 (Div. 2)A,B,C,D,E(STL,dp,贪心,bfs,dfs序+线段树)
A. Alex and broken contest time limit per test 2 seconds memory limit per test 256 megabytes input s ...
- Codeforces Round #622 (Div. 2) A. Fast Food Restaurant(全排列,DFS)
Codeforces Round #622 (Div. 2) A. Fast Food Restaurant 题意: 你是餐馆老板,虽然只会做三道菜,上菜时还有个怪癖:一位客人至少上一道菜,且一种菜最 ...
- Codeforces Round #442 (Div. 2) Danil and a Part-time Job
http://codeforces.com/contest/877/problem/E 真的菜的不行,自己敲一个模板,到处都是问题.哎 #include <bits/stdc++.h> u ...
- Codeforces Round #442 Div.2 A B C D E
A. Alex and broken contest 题意 判断一个字符串内出现五个给定的子串多少次. Code #include <bits/stdc++.h> char s[110]; ...
- Codeforces Round #877 (Div. 2) E. Danil and a Part-time Job
E. Danil and a Part-time Job 题目链接:http://codeforces.com/contest/877/problem/E time limit per test2 s ...
- Codeforces Round #442 (Div. 2)
A. Alex and broken contest time limit per test 2 seconds memory limit per test 256 megabytes input s ...
- 【Codeforces Round #442 (Div. 2) A】Alex and broken contest
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 注意是所有的名字里面,只出现了其中某一个名字一次. [代码] #include <bits/stdc++.h> usin ...
- 【Codeforces Round #442 (Div. 2) D】Olya and Energy Drinks
[链接] 我是链接,点我呀:) [题意] 给一张二维点格图,其中有一些点可以走,一些不可以走,你每次可以走1..k步,问你起点到终点的最短路. [题解] 不能之前访问过那个点就不访问了.->即k ...
随机推荐
- OSPF Sham-Link配置示例
在MPLS/VPN环境中,如果PE-CE之间使用OSPF交换路由信息,OSPF route将作为VPNv4 route(携带OSPF domain ID,OSPF Router ID,OSPF Rou ...
- WebService之客户端
创建项目 File→New→Other→Web Services→Web Service Client中输入从服务端得到的wsdl链接: http://localhost:8080/WS_WebSer ...
- spark安装
Spark下载 在spark主页的download下,选择自己想要安装的spark版本, 注意跟本地hadoop的兼容性.我这里选择了2.4.0. https://www.apache.org/dyn ...
- 计算机网络学习-20180901-TCP/IP协议的五大分层
摘要:TCP/IP协议的五大分层:应用层.传输层.网络层.数据链路层.物理层(附带一个第0层物理媒介):互联网的核心,即为ip协议. TCP/IP协议的五大分层 5-应用层:获取主机中进程所产生的数据 ...
- vue 用正则保护路由参数的合法性
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 记录1-更换mac pro内存,硬盘及恢复系统
我的mac pro是2012年初买的,4G/500G HDD在服役了六年多后速度堪比老牛,以前装的虚拟机压根不敢打开.这几天把内存更换为8G,硬盘升级为samsung的1T SSD,感觉像起死回生一样 ...
- 记录2-在mac上安装ubuntu 16.04 LTS
前几天升级了我用了六七年mac硬件,内存由4G变为8G,硬盘也换成1T SSD,索性把一直想装的ubuntu也装了,方便温习下以前的工作环境. 我比较喜欢LTS的版本,所以安装了16.04. 主要步骤 ...
- linux 终端 pac ssh登录工具使用教程
1.下载: 首先下载deb文件:https://sourceforge.net/projects/pacmanager/ 2.安装: dpkg -i pac-4.5.5.7-all.deb 3.安装依 ...
- var let const
你真的永远都不用var了吗? javascript的一些争论已经浮现出了一些经典的案例,因此,es6的拥护者你们应该讲var遗忘吗?这篇博客将带你走进被遗忘的角落 首先举例反对者的几个观点: 1.如果 ...
- 数据库索引的数据结构b+树
b+树的查找过程:如上图所示,如果要查找数据项29,那么首先会把磁盘块1由磁盘加载到内存,此时发生一次IO,在内存中用二分查找确定29在17和35之间,锁定磁盘块1的P2指针, ...