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;
}

以上是关于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

CF877E Danil and a Part-time Job 线段树维护dfs序

如何在插入中使用子查询? [关闭]

CodeForces 621AWet Shark and Odd and Even