http://codeforces.com/problemset/problem/877/E

  给出一颗有根树,没个节点上有一个值0/1,有两种操作,一个是选中一个节点,对他所对应的那个子树上所有节点的值进行翻转0->1,1->0,

第二种操作是询问一个节点对应的子树中所有节点的值的和。

   如果是对一个区间进行上述操作,那么显然就是裸的线段树了,把这颗树按照先序遍历进行重新编号,这样的优点在于,每个节点对应的子树的节点的编号都是从根开始连续增长的,我们只要知道根的编号和树的大小,就能把上述询问转化为了区间修改查询的线段树了!

  思路很棒,可惜自己没想到。

  

 #include<iostream>
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define mid ((L+R)>>1)
#define lc (id<<1)
#define rc (id<<1|1)
const int maxn=;
vector<int>g[maxn];
int p[maxn],son[maxn];
void dfs(int u,int fa,int &x){
p[u]=x;
son[p[u]]=;
for(int i=;i<g[u].size();++i){
if(g[u][i]==fa)continue;
dfs(g[u][i],u,++x);
son[p[u]]+=son[p[g[u][i]]];
}
}
int t[maxn],sum[maxn<<];
bool tag[maxn<<];
void build(int id,int L,int R){
//puts("FFF");
if(L==R){
sum[id]=t[L];
return;
}
build(lc,L,mid);
build(rc,mid+,R);
sum[id]=sum[lc]+sum[rc];
}
void pushdown(int id,int L,int R){
if(tag[id]){
tag[lc]^=;sum[lc]=(mid-L+-sum[lc]);
tag[rc]^=;sum[rc]=(R-mid-sum[rc]);
tag[id]=;
}
}
int ask(int id,int L,int R,int l,int r){
if(L>=l&&R<=r){
return sum[id];
}
pushdown(id,L,R);
if(r<=mid)return ask(lc,L,mid,l,r);
else if(l>mid) return ask(rc,mid+,R,l,r);
else return ask(lc,L,mid,l,r)+ask(rc,mid+,R,l,r);
}
void change(int id,int L,int R,int l,int r){
if(L>=l&&R<=r){
tag[id]^=;
sum[id]=(R-L+-sum[id]);
return;
}
pushdown(id,L,R);
if(l<=mid) change(lc,L,mid,l,r);
if(r>mid) change(rc,mid+,R,l,r);
sum[id]=sum[lc]+sum[rc];
}
int main(){
int n,m,v,x=;
scanf("%d",&n);
for(int i=;i<=n;++i){
scanf("%d",&v);
g[v].push_back(i);
g[i].push_back(v);
}
dfs(,,x);
for(int i=;i<=n;++i){
scanf("%d",&t[p[i]]);
}
build(,,n);
scanf("%d",&m);
char s[];
while(m--){
scanf("%s %d",s,&v);
if(s[]=='g'){
printf("%d\n",ask(,,n,p[v],p[v]+son[p[v]]-));
}
else{
change(,,n,p[v],p[v]+son[p[v]]-);
}
}
return ;
}

CF-877E-线段树+哈希的更多相关文章

  1. 线段树+哈希【CF580E】Kefa and Watch

    线段树+哈希[CF580E]Kefa and Watch Description \(n\)个数的字符串,\(m + k\)个操作 1 l r k把\(l - r\)赋值为\(k\) 2 l r d询 ...

  2. 【线段树哈希】「Balkan OI 2016」Haker

    1A海星 题目大意 给你一个长度为 $n$ ,由小写字母构成的字符串 $S$ 和 $Q$ 个操作,每个操作是以下 3 种之一: 1 x y k :询问当前字符串从位置 $x$ 到 $y$ 的子串与从位 ...

  3. CF 19D 线段树+set压缩坐标轴+离散化map

    题意: n个操作,在200000*200000的平面上加删点 find 严格在坐标右上角,x最小,再y最小的点 线段树做,区间为离散化后的 X轴坐标 ,维护区间点数 和 最小的 y 值 ( 维护最小y ...

  4. CF 552(div 3) E Two Teams 线段树,模拟链表

    题目链接:http://codeforces.com/contest/1154/problem/E 题意:两个人轮流取最大值与旁边k个数,问最后这所有的数分别被谁给取走了 分析:看这道题一点思路都没有 ...

  5. 51Nod1553 周期串查询 字符串 哈希 线段树

    原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1553.html 题目传送门 - 51Nod1553 题意 有一个串只包含数字字符.串的长度为n,下标 ...

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

  7. CF 1023D Array Restoration - 线段树

    题解 非常容易想到的线段树, 还可以用并查集来. 还有一位大神用了$O(n)$ 就过了Orz 要判断是否能染色出输入给出的序列,必须满足两个条件: 1. 序列中必须存在一个$q$ 2. 两个相同的数$ ...

  8. cf 786 B 线段树优化建图

    cf 786 B 链接 CF 思路 n个点,3种建边方式,规模\(O(n^2)\) 线段树优化建图 注意 读入的数据好坑啊,说好的v,u变成了u,v. 两棵树,一棵出,一棵入.线段树的作用只不过是按照 ...

  9. [bzoj2124]等差子序列——线段树+字符串哈希

    题目大意 给一个1到N的排列\(A_i\),询问是否存在\(p_i\),\(i>=3\),使得\(A_{p_1}, A_{p_2}, ... ,A_{p_len}\)是一个等差序列. 题解 显然 ...

  10. CF 787D Legacy(线段树思想构图+最短路)

    D. Legacy time limit per test 2 seconds memory limit per test 256 megabytes input standard input out ...

随机推荐

  1. CSS基本内容

    CSS样式表的三种引入方式: 1.外部样式表——即将CSS样式写在单独的一个.css文件中: <link rel="stylesheet" type="text/c ...

  2. P4574 [CQOI2013]二进制A+B

    传送门 思路: 本题可用数位DP来做,设 f [ i ][ a ][ b ][ c ][ j ] 表示当前枚举到(二进制下的)第i位,a' b' c'各用a,b,c了几个1,j表示最后一位是否有进位. ...

  3. C# 使用 protobuf 进行对象序列化与反序列化

    protobuf 是 google的一个开源项目,可用于以下两种用途: (1)数据的存储(序列化和反序列化),类似于xml.json等: (2)制作网络通信协议. 源代码下载地址:https://gi ...

  4. scala中option、None、some对象

    转载:http://www.jianshu.com/p/95896d06a94d 1.option类型避免对象是空值,造成空指针异常. 2.None对象表示null,在没有对象返回时使用,some在有 ...

  5. PostgreSQL安装及使用教程二(zip解压方式)

    下载postgre包  下载地址:https://www.postgresql.org/download/ 选DOWNLOADS--Windows--zip archive--version10.6- ...

  6. ABP配置模块扩展

    1.定义一个接口  里面是配置的属性等 public interface IMyConfiguration { int Id { get; set; } string Name { get; set; ...

  7. 修改Anaconda中的Jupyter Notebook默认工作路径

    这二天,安装了anaconda想更改jupyter的工作路径,在网上找了一下 方式1. 打开Windows的cmd,在cmd中输入jupyter notebook --generate-config如 ...

  8. linux基础02-bash特性

    Linux的行结束符是:[$] Windows的行结束符是:[$+回车] 目录管理:ls.cd.pwd.mkdir.rmdir.tree 文件管理:touch.stat.file.rm.cp.mv.n ...

  9. python sshtunnel 简单介绍

    背景,公司的很多服务包括数据库访问都需要通过跳板机访问,为日常工作及使用带来了麻烦,特别数python直接操作数据更是麻烦了,所以一直想实现python 通过跳板机访问数据库的操作. 安装 pip3. ...

  10. Axure 设置条件的操作

    登录的三种场景: 1.用户名为空,只输入密码时,执行三个动作:跳出提示内容(用户名为空).光标定位在用户名的文本框中.清空密码的文本框: 2.密码为空,只输入用户名,执行两个操作:跳出提示内容(密码为 ...