题目链接   Danil and a Part-time Job

题意    给出一系列询问或者修改操作

   $pow$ $x$表示把以$x$为根的子树的所有结点的状态取反($0$变$1$,$1$变$0$)

   $get$  $x$表示求以$x$为根的子树中状态为$1$的结点数。

首先大力$dfs$序,然后线段树操作一下。

具体问题转化为:区间翻转,区间求和。

#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b)	for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i)
#define ls i << 1
#define rs i << 1 | 1
#define lson ls, L, mid
#define rson rs, mid + 1, R const int N = 2e5 + 10; struct node{
int s[2];
int len;
} t[N * 3]; int in[N], out[N], dc[N * 3], dt[N * 3], f[N], a[N];
int n, q, ti; vector <int> v[N]; void dfs(int x){
in[x] = ++ti;
f[ti] = x;
for (auto u : v[x]) dfs(u);
out[x] = ti;
} node update(node x, node y){
node ans;
ans.len = x.len + y.len;
rep(i, 0, 1) ans.s[i] = x.s[i] + y.s[i];
return ans;
} void build(int i, int L, int R){
if (L == R){
int z = a[f[L]];
t[i].len = t[i].s[z] = 1;
t[i].s[z ^ 1] = 0;
dc[i] = -1;
dt[i] = 0;
return ;
} int mid = (L + R) >> 1;
build(lson);
build(rson);
t[i] = update(t[ls], t[rs]);
dc[i] = -1;
dt[i] = 0;
} void cover(int i, int z){
dc[i] = z;
dt[i] = 0;
t[i].s[z] = t[i].len;
t[i].s[z ^ 1] = 0;
} void turn(int i, int z){
if (~z){
dc[i] ^= 1;
t[i].s[z] = 0;
t[i].s[z ^ 1] = t[i].len;
} else{
dt[i] ^= 1;
swap(t[i].s[0], t[i].s[1]);
}
} void pushdown(int i){
if (~dc[i]){
cover(ls, dc[i]);
cover(rs, dc[i]);
dc[i] = -1;
} if (dt[i]){
turn(ls, dc[ls]);
turn(rs, dc[rs]);
dt[i] = 0;
}
} void Turn(int i, int L, int R, int x, int y){
if (x <= L && R <= y){
turn(i, dc[i]);
return;
} pushdown(i);
int mid = (L + R) >> 1;
if (x <= mid) Turn(lson, x, y);
if (y > mid) Turn(rson, x, y);
t[i] = update(t[ls], t[rs]);
} int query(int i, int L, int R, int x, int y){
int ret = 0;
if (x <= L && R <= y) return t[i].s[1];
int mid = (L + R) >> 1;
pushdown(i);
if (x <= mid) ret += query(lson, x, y);
if (y > mid ) ret += query(rson, x, y);
return ret;
} int main(){ scanf("%d", &n);
rep(i, 2, n){
int x;
scanf("%d", &x);
v[x].push_back(i);
} dfs(1);
rep(i, 1, n) scanf("%d", a + i);
build(1, 1, n); for (scanf("%d", &q); q--; ){
char op[10]; int x;
scanf("%s%d", op, &x);
if (op[0] == 'g') printf("%d\n", query(1, 1, n, in[x], out[x]));
else Turn(1, 1, n, in[x], out[x]);
} return 0;
}

  

Codeforces 877E Danil and a Part-time Job(dfs序 + 线段树)的更多相关文章

  1. Codeforces 877E - Danil and a Part-time Job(dfs序+线段树)

    877E - Danil and a Part-time Job 思路:dfs序+线段树 dfs序:http://blog.csdn.net/qq_24489717/article/details/5 ...

  2. Codeforces Round #225 (Div. 2) E. Propagating tree dfs序+-线段树

    题目链接:点击传送 E. Propagating tree time limit per test 2 seconds memory limit per test 256 megabytes inpu ...

  3. CodeForces 877E Danil and a Part-time Job(dfs序+线段树)

    Danil decided to earn some money, so he had found a part-time job. The interview have went well, so ...

  4. CodeForces 877E DFS序+线段树

    CodeForces 877E DFS序+线段树 题意 就是树上有n个点,然后每个点都有一盏灯,给出初始的状态,1表示亮,0表示不亮,然后有两种操作,第一种是get x,表示你需要输出x的子树和x本身 ...

  5. 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 ...

  6. Codeforces 838B - Diverging Directions - [DFS序+线段树]

    题目链接:http://codeforces.com/problemset/problem/838/B You are given a directed weighted graph with n n ...

  7. Educational Codeforces Round 6 E dfs序+线段树

    题意:给出一颗有根树的构造和一开始每个点的颜色 有两种操作 1 : 给定点的子树群体涂色 2 : 求给定点的子树中有多少种颜色 比较容易想到dfs序+线段树去做 dfs序是很久以前看的bilibili ...

  8. Codeforces 343D Water Tree(DFS序 + 线段树)

    题目大概说给一棵树,进行以下3个操作:把某结点为根的子树中各个结点值设为1.把某结点以及其各个祖先值设为0.询问某结点的值. 对于第一个操作就是经典的DFS序+线段树了.而对于第二个操作,考虑再维护一 ...

  9. Codeforces 620E New Year Tree(DFS序 + 线段树)

    题目大概说给一棵树,树上结点都有颜色(1到60),进行下面两个操作:把某结点为根的子树染成某一颜色.询问某结点为根的子树有多少种颜色. 子树,显然DFS序,把子树结点映射到连续的区间.而注意到颜色60 ...

随机推荐

  1. Developing for nRF52810(转载)

    Table of Contents Introduction Hardware emulation of nRF52810 Limitations Software emulation of nRF5 ...

  2. ACM-ICPC 2018 徐州赛区网络预赛 F. Features Track

    262144K   Morgana is learning computer vision, and he likes cats, too. One day he wants to find the ...

  3. hdu 6318

    Long long ago, there was an integer sequence a.Tonyfang think this sequence is messy, so he will cou ...

  4. SAS描述统计量

    MEANS过程 MEAN过程默认输出的统计量有:观测总数.均值.标准差.最大值和最小值.如果要计算其他统计量或其中的某一些统计量,则可在PROC语句中指定统计量的关键字. BY语句规定了分组变量,要求 ...

  5. 【12】Firefox 快捷键大全及更改和定制快捷键的方法

    [12]Firefox 快捷键大全及更改和定制快捷键的方法 答: Firefox 本身没有提供更改和定制快捷键的选项,若有需要,请安装扩展 Keyconfig 来解决.  安装地址如下: Keycon ...

  6. Scala学习-01-变量与类型

    Scala运行在jvm之上,可以调用Java类库和与Java框架交互,并将面向对象与面向函数结合在一起. 特点: 1 保留了静态类型检查.安全保障高. 2 函数式编程,更加灵活. 3 运行于jvm之上 ...

  7. 通用的前端js代码

    1.判断是否移动设备的浏览器,是否允许触摸事件.(响应式网页) if(/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i. ...

  8. 电商平台API接口

  9. (英文排版测试)Lorem Ipsum

    Lorem Ipsum Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis tincidunt consequat pretiu ...

  10. AtCoder Grand Contest 022

    A - Diverse Word Time limit : 2sec / Memory limit : 256MB Score : 300 points Problem Statement Gotou ...