codeforces 877E Danil and a Part-time Job
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codeforces 877E Danil and a Part-time Job相关的知识,希望对你有一定的参考价值。
鏍囩锛?a href='http://www.mamicode.com/so/1/mat' title='mat'>mat
upd std printf line lse dfs for continue鐩綍
codeforces 877E Danil and a Part-time Job
棰樻剰锛?/h3>
缁欏嚭涓€涓爲锛屾瘡涓€涓偣閮芥湁鏉冨€硷紝鏉冨€间负0鎴?锛岃姹傛敮鎸佷袱涓搷浣滐細瀛愭爲鏉冨€肩炕杞紝瀛愭爲鏉冨€煎拰銆?/p>
棰樿В锛?/h3>
姣旇緝姘寸殑涓€閬揈棰樺惂锛屽弽姝e氨鏄敤绾挎鏍戠淮鎶?span class="math inline">(Dfn)
搴忓氨琛屼簡锛屽樊涓嶅鏍戝墫閭d釜濂楄矾鍚с€傘€?/p>Code锛?/h3>
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+500;
int idx[N],x[N],v[N],sz[N],heav[N];
int n,cnt,q;
vector<int>G[N];
namespace SegmentTree {
struct node {
int l,r,sz,cnt,flip;
}t[N<<3];
#define ls(o) (o)<<1
#define rs(o) (o)<<1|1
void Update(int o) {
t[o].cnt=t[ls(o)].cnt+t[rs(o)].cnt;
}
void Pushdown(int o) {
if(!t[o].flip) return ;
t[ls(o)].cnt=t[ls(o)].sz-t[ls(o)].cnt;
t[rs(o)].cnt=t[rs(o)].sz-t[rs(o)].cnt;
t[ls(o)].flip^=1;
t[rs(o)].flip^=1;
t[o].flip^=1;
return ;
}
void Build(int o,int l,int r) {
t[o].l=l;t[o].r=r;t[o].sz=r-l+1;
if(l==r) {
t[o].cnt=v[l];
return ;
}
int mid=(l+r)>>1;
Build(ls(o),l,mid);
Build(rs(o),mid+1,r);
Update(o);
return ;
}
void Modify(int o,int l,int r) {
if(t[o].l>=l&&t[o].r<=r) {
t[o].cnt=t[o].sz-t[o].cnt;
t[o].flip^=1;
return ;
}
Pushdown(o);
int mid=(t[o].l+t[o].r)>>1;
if(mid>=l) Modify(ls(o),l,r);
if(mid<r) Modify(rs(o),l,r);
Update(o);
return ;
}
int Query(int o,int l,int r) {
if(t[o].l>=l&&t[o].r<=r) return t[o].cnt;
Pushdown(o);
int mid=(t[o].l+t[o].r)>>1;
int ans=0;
if(mid>=l) ans+=Query(ls(o),l,r);
if(mid<r) ans+=Query(rs(o),l,r);
return ans;
}
}
using namespace SegmentTree;
namespace Solver {
void Dfs1(int o,int fa) {
sz[o]=1;
int Mxson=-1;
for(int i=0;i<(int)G[o].size();i++) {
int to=G[o][i];
if(to==fa) continue;
Dfs1(to,o);
sz[o]+=sz[to];
if(sz[to]>Mxson) {
Mxson=sz[to];
heav[o]=to;
}
}
}
void Dfs2(int o) {
idx[o]=++cnt;
v[cnt]=x[o];
if(!heav[o]) return ;
Dfs2(heav[o]);
for(int i=0;i<(int)G[o].size();i++) {
int to=G[o][i];
if(idx[to]) continue;
Dfs2(to);
}
}
void Init() {
Dfs1(1,1);
Dfs2(1);
Build(1,1,n);
}
void Change(int o) {Modify(1,idx[o],idx[o]+sz[o]-1);}
int Ask(int o) {return Query(1,idx[o],idx[o]+sz[o]-1);}
}
int main() {
scanf("%d",&n);
for(int i=2,p;i<=n;i++) {
scanf("%d",&p);
G[p].push_back(i);
G[i].push_back(p);
}
for(int i=1;i<=n;i++) scanf("%d",&x[i]);
Solver::Init();
scanf("%d",&q);
while(q--) {
char s[10];
int x;
scanf("%s%d",s,&x);
if(s[0]=='g') printf("%d
",Solver::Ask(x));
else Solver::Change(x);
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+500;
int idx[N],x[N],v[N],sz[N],heav[N];
int n,cnt,q;
vector<int>G[N];
namespace SegmentTree {
struct node {
int l,r,sz,cnt,flip;
}t[N<<3];
#define ls(o) (o)<<1
#define rs(o) (o)<<1|1
void Update(int o) {
t[o].cnt=t[ls(o)].cnt+t[rs(o)].cnt;
}
void Pushdown(int o) {
if(!t[o].flip) return ;
t[ls(o)].cnt=t[ls(o)].sz-t[ls(o)].cnt;
t[rs(o)].cnt=t[rs(o)].sz-t[rs(o)].cnt;
t[ls(o)].flip^=1;
t[rs(o)].flip^=1;
t[o].flip^=1;
return ;
}
void Build(int o,int l,int r) {
t[o].l=l;t[o].r=r;t[o].sz=r-l+1;
if(l==r) {
t[o].cnt=v[l];
return ;
}
int mid=(l+r)>>1;
Build(ls(o),l,mid);
Build(rs(o),mid+1,r);
Update(o);
return ;
}
void Modify(int o,int l,int r) {
if(t[o].l>=l&&t[o].r<=r) {
t[o].cnt=t[o].sz-t[o].cnt;
t[o].flip^=1;
return ;
}
Pushdown(o);
int mid=(t[o].l+t[o].r)>>1;
if(mid>=l) Modify(ls(o),l,r);
if(mid<r) Modify(rs(o),l,r);
Update(o);
return ;
}
int Query(int o,int l,int r) {
if(t[o].l>=l&&t[o].r<=r) return t[o].cnt;
Pushdown(o);
int mid=(t[o].l+t[o].r)>>1;
int ans=0;
if(mid>=l) ans+=Query(ls(o),l,r);
if(mid<r) ans+=Query(rs(o),l,r);
return ans;
}
}
using namespace SegmentTree;
namespace Solver {
void Dfs1(int o,int fa) {
sz[o]=1;
int Mxson=-1;
for(int i=0;i<(int)G[o].size();i++) {
int to=G[o][i];
if(to==fa) continue;
Dfs1(to,o);
sz[o]+=sz[to];
if(sz[to]>Mxson) {
Mxson=sz[to];
heav[o]=to;
}
}
}
void Dfs2(int o) {
idx[o]=++cnt;
v[cnt]=x[o];
if(!heav[o]) return ;
Dfs2(heav[o]);
for(int i=0;i<(int)G[o].size();i++) {
int to=G[o][i];
if(idx[to]) continue;
Dfs2(to);
}
}
void Init() {
Dfs1(1,1);
Dfs2(1);
Build(1,1,n);
}
void Change(int o) {Modify(1,idx[o],idx[o]+sz[o]-1);}
int Ask(int o) {return Query(1,idx[o],idx[o]+sz[o]-1);}
}
int main() {
scanf("%d",&n);
for(int i=2,p;i<=n;i++) {
scanf("%d",&p);
G[p].push_back(i);
G[i].push_back(p);
}
for(int i=1;i<=n;i++) scanf("%d",&x[i]);
Solver::Init();
scanf("%d",&q);
while(q--) {
char s[10];
int x;
scanf("%s%d",s,&x);
if(s[0]=='g') printf("%d
",Solver::Ask(x));
else Solver::Change(x);
}
return 0;
}
以上是关于codeforces 877E Danil and a Part-time Job的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #442 (Div. 2) 877E - Danil and a Part-time Job dfs序+线段树
877E - Danil and a Part-time Job(dfs序+线段树)
codefroces 877E - Danil and a Part-time Job