Codeforces Round #442 (Div. 2) E. Danil and a Part-time Job【线段树+dfs序】
来源:互联网 发布:江东是哪里 知乎 编辑:程序博客网 时间:2024/05/19 08:44
对原来的图进行一波dfs,序列化,用线段树维护。查询就是线段树上区间查询,修改时可以用延迟标记一下。
/* ***********************************************Author :xiang578Email :i@xiang578.comCreated Time :Mon Nov 6 14:30:42 2017File Name :cf877e.cpp************************************************ */#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <vector>#include <queue>#include <set>#include <map>#include <string>#include <math.h>#include <stdlib.h>#include <time.h>using namespace std;const int n=400000+10;int N,sum[4*n],lazy[4*n],in[n],out[n],a[n],mp[n],cnt;vector<int>g[n];void dfs(int x){ in[x]=++cnt; mp[cnt]=x; for(int i=0;i<g[x].size();i++) dfs(g[x][i]); out[x]=cnt;}void build(int rt,int l,int r){ lazy[rt]=0; if(l==r) {sum[rt]=a[mp[l]];} else { int mid = (l+r)/2; build(rt*2,l,mid); build(rt*2+1,mid+1,r); sum[rt]=sum[rt*2]+sum[rt*2+1]; }}void pushdown(int rt,int l,int r){ lazy[rt]=0; int mid=(l+r)/2; sum[rt*2]=mid-l+1-sum[rt*2]; sum[rt*2+1]=r-(mid+1)+1-sum[rt*2+1]; lazy[rt*2]^=1; lazy[rt*2+1]^=1;}int query(int rt,int l,int r,int ql,int qr){ if(l>=ql&&r<=qr) { return sum[rt]; } else { int mid = (l+r)/2; if(lazy[rt]) pushdown(rt,l,r); int ret=0; if(mid>=ql) ret+=query(rt*2,l,mid,ql,qr); if(mid+1<=qr) ret+=query(rt*2+1,mid+1,r,ql,qr); return ret; }}void change(int rt,int l,int r,int ql,int qr){ if(l>=ql&&qr>=r) { sum[rt]=r-l+1-sum[rt]; lazy[rt]^=1; } else{ int mid = (l+r)/2; if(lazy[rt]) pushdown(rt,l,r); if(mid>=ql) change(rt*2,l,mid,ql,qr); if(mid+1<=qr) change(rt*2+1,mid+1,r,ql,qr); sum[rt]=sum[rt*2]+sum[rt*2+1]; }}int main(){ //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); cnt=0; scanf("%d",&N); for(int i=2;i<=N;i++) { int t; scanf("%d",&t); g[t].push_back(i); } dfs(1); for(int i=1;i<=N;i++) { scanf("%d",a+i); } build(1,1,N); int m; scanf("%d",&m); while(m--) { char s[10]; int c; scanf("%s%d",s,&c); if(s[0]=='g') { //printf("%d %d\n",in[c],out[c]); printf("%d\n",query(1,1,N,in[c],out[c])); } else { //printf("%d %d\n",in[c],out[c]); change(1,1,N,in[c],out[c]); } } return 0;}
阅读全文
0 0
- Codeforces Round #442 (Div. 2) E. Danil and a Part-time Job【线段树+dfs序】
- Codeforces Round #442 (Div. 2)-E-Danil and a Part-time Job(DFS序+线段树区间更新)
- Codeforces Round #442 (Div. 2) 877 E. Danil and a Part-time Job DFS序 线段树
- Codeforces Round #442 (Div. 2) E. Danil and a Part-time Job DFS序+树链剖分+线段树区间^
- Codeforces Round #442 (Div. 2) E. Danil and a Part-time Job (dfs序+线段树)
- Codeforces Round #442 (Div. 2) Danil and a Part-time Job dfs序+线段树区间反转
- Codeforces Round #442E-dfs序&线段树的区间更新区间查询-Danil and a Part-time Job
- Codeforces Round #442 (Div. 2) E. Danil and a Part-time Job (dfs序树型转线性 线段树区间修改区间查询)
- Codeforces 877E Danil and a Part-time Job【Dfs序+线段树】
- Codeforces 877 E Danil and a Part-time Job(线段树+dfs序)
- [codeforces] 877E. Danil and a Part-time Job(DFS序+线段树)
- CodeForces 877E Danil and a Part-time Job (dfs序+线段树)
- Codeforces Round #442 (Div. 2) E. Danil and a Part-time Job
- Codeforces-877E:Danil and a Part-time Job(DFS序列+线段树)
- codeforces 877E. Danil and a Part-time Job (DFS序列+线段树)
- Codeforces Round #877 (Div. 2) E. Danil and a Part-time Job
- codeforces 877 problem E Danil and a Part-time Job 【dfs序 + 线段树区间异或修改】
- CF#877 E. Danil and a Part-time Job(DFS序+线段树)
- 模拟+乱搞——我有特殊的懵题技巧
- Oracle的安装及可视化工具PL/SQL配置
- python 属性描述符
- Java的Math.random()随机函数的使用
- 设计模式-包装模式(代理模式、适配器模式、外观模式)
- Codeforces Round #442 (Div. 2) E. Danil and a Part-time Job【线段树+dfs序】
- arm汇编—str指令
- iPhone X 的凹槽 和 iOS 11 中一些相关 CSS 属性
- Failed to read auto-increment value from storage engine
- idea配置SpringBoot热部署
- Java小代码(可直接用)
- Dubbo-SPI
- Caused by: org.apache.ibatis.builder.BuilderException: Error resolving class . Cause: org.apache.iba
- Node.js学习笔记(1)