Codeforces 877E Danil and a Part-time Job(dfs序 + 线段树)
题目链接 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序 + 线段树)的更多相关文章
- 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 ...
- 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 ...
- 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 ...
- CodeForces 877E DFS序+线段树
CodeForces 877E DFS序+线段树 题意 就是树上有n个点,然后每个点都有一盏灯,给出初始的状态,1表示亮,0表示不亮,然后有两种操作,第一种是get x,表示你需要输出x的子树和x本身 ...
- 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 838B - Diverging Directions - [DFS序+线段树]
题目链接:http://codeforces.com/problemset/problem/838/B You are given a directed weighted graph with n n ...
- Educational Codeforces Round 6 E dfs序+线段树
题意:给出一颗有根树的构造和一开始每个点的颜色 有两种操作 1 : 给定点的子树群体涂色 2 : 求给定点的子树中有多少种颜色 比较容易想到dfs序+线段树去做 dfs序是很久以前看的bilibili ...
- Codeforces 343D Water Tree(DFS序 + 线段树)
题目大概说给一棵树,进行以下3个操作:把某结点为根的子树中各个结点值设为1.把某结点以及其各个祖先值设为0.询问某结点的值. 对于第一个操作就是经典的DFS序+线段树了.而对于第二个操作,考虑再维护一 ...
- Codeforces 620E New Year Tree(DFS序 + 线段树)
题目大概说给一棵树,树上结点都有颜色(1到60),进行下面两个操作:把某结点为根的子树染成某一颜色.询问某结点为根的子树有多少种颜色. 子树,显然DFS序,把子树结点映射到连续的区间.而注意到颜色60 ...
随机推荐
- python能干什么?
python能干什么? 网络爬虫 爬虫,指的是从互联网采集数据的程序脚本 . 爬天爬地爬空气 ,无聊的时候爬一爬吃鸡数据.b站评论,能得出很多有意思的结论.知乎有个很有意思的问题——"利用爬 ...
- LeetCode(154) Find Minimum in Rotated Sorted Array II
题目 Follow up for "Find Minimum in Rotated Sorted Array": What if duplicates are allowed? W ...
- 合肥工业大学宣城校区大学生创新创业训练项目申报书:“基于Spark平台的人工智能知识的知识图谱构建”
- pidgin中使用QQ
安装 实现的功能: 可以发送静态表情 可以发送动态表情 可以发图片? 可以添加好友 可以添加群?
- Linux学习-延伸正则表达式
grep 默认仅支持基础正则表达式,如果要使用延伸型正则 表达式,你可以使用 grep -E , 不过更建议直接使用 egrep !直接区分指令比较好记忆!其 实 egrep 与 grep -E 是类 ...
- 使用html+javascriptt实现的简易四则运算(初学JavaScript笔记)
今天第一天学javascript,做了个简易的四则运算,提供参考,效果图: html代码: <!DOCTYPE html> <html > <head > < ...
- 一个通用的分页存储过程实现-SqlServer(附上sql源码,一键执行即刻搭建运行环境)
使用前提 查询表必须有ID字段,且该字段不能重复,建议为自增主键 背景 如果使用ADO.NET进行开发,在查询分页数据的时候一般都是使用分页存储过程来实现的,本文提供一种通用的分页存储过程,只需要传入 ...
- 02_ThreadLocal语法与源码分析
文章导读: 早在JDK 1.2的版本中就提供Java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地编写出优美的多线程 ...
- Node.js中测试mysql的代码var client = mysql.createClient运行出错:TypeError: Object # has no method ‘createClient’
今天在WebStorm下熟悉一个node.js的项目,配置环境时,手一抖,将mysql包从0.8升级到了2.1.1,结果再运行时就出错了. [Fri Mar 14 2014 17:05:49] 连接数 ...
- SDOJ 1195 Zhenhuan
描述 今日又在看甄嬛传,皇上觉得后宫们的勾心斗角太险恶了,有点不好,决定给每个妃子发丝带以让后宫之间和睦相处.皇上一共有N个后宫(标号为1~n),站成一个环形(1号与n号相邻),每个后宫想要ai个丝带 ...