CF-877E-线段树+哈希
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-线段树+哈希的更多相关文章
- 线段树+哈希【CF580E】Kefa and Watch
线段树+哈希[CF580E]Kefa and Watch Description \(n\)个数的字符串,\(m + k\)个操作 1 l r k把\(l - r\)赋值为\(k\) 2 l r d询 ...
- 【线段树哈希】「Balkan OI 2016」Haker
1A海星 题目大意 给你一个长度为 $n$ ,由小写字母构成的字符串 $S$ 和 $Q$ 个操作,每个操作是以下 3 种之一: 1 x y k :询问当前字符串从位置 $x$ 到 $y$ 的子串与从位 ...
- CF 19D 线段树+set压缩坐标轴+离散化map
题意: n个操作,在200000*200000的平面上加删点 find 严格在坐标右上角,x最小,再y最小的点 线段树做,区间为离散化后的 X轴坐标 ,维护区间点数 和 最小的 y 值 ( 维护最小y ...
- CF 552(div 3) E Two Teams 线段树,模拟链表
题目链接:http://codeforces.com/contest/1154/problem/E 题意:两个人轮流取最大值与旁边k个数,问最后这所有的数分别被谁给取走了 分析:看这道题一点思路都没有 ...
- 51Nod1553 周期串查询 字符串 哈希 线段树
原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1553.html 题目传送门 - 51Nod1553 题意 有一个串只包含数字字符.串的长度为n,下标 ...
- 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 ...
- CF 1023D Array Restoration - 线段树
题解 非常容易想到的线段树, 还可以用并查集来. 还有一位大神用了$O(n)$ 就过了Orz 要判断是否能染色出输入给出的序列,必须满足两个条件: 1. 序列中必须存在一个$q$ 2. 两个相同的数$ ...
- cf 786 B 线段树优化建图
cf 786 B 链接 CF 思路 n个点,3种建边方式,规模\(O(n^2)\) 线段树优化建图 注意 读入的数据好坑啊,说好的v,u变成了u,v. 两棵树,一棵出,一棵入.线段树的作用只不过是按照 ...
- [bzoj2124]等差子序列——线段树+字符串哈希
题目大意 给一个1到N的排列\(A_i\),询问是否存在\(p_i\),\(i>=3\),使得\(A_{p_1}, A_{p_2}, ... ,A_{p_len}\)是一个等差序列. 题解 显然 ...
- CF 787D Legacy(线段树思想构图+最短路)
D. Legacy time limit per test 2 seconds memory limit per test 256 megabytes input standard input out ...
随机推荐
- 【NOIP 2016】Day2 T3 愤怒的小鸟
Problem Description \(Kiana\) 最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于 \((0,0)\) 处,每次 \(Kiana\ ...
- linux使用技巧,返回上一次目录
cd - 当你一不小心,走岔了的时候,可以通过这个命令,直接找回上一次的路径.
- MySql连接时出现1251 client does no support authentic错误解决方法
使用Navicat Premium软件连接时,报错: 解决方法: 修改配置项:ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password B ...
- [转]xml解析工具的效率比较QDomDocument、TinyXml-2、RapidXml、PugiXml
转自:http://www.itdaan.com/blog/2017/02/20/301ad47832f4.html 由于windows环境下测试不稳定,博主选择在linux下进行的测试! Qt - ...
- python IOError: [Errno 22] invalid mode ('r') or filename:
如果你是报这个错误,可能是因为你的文件路径中的中文字符太多的缘故. 你可以将路径或者文件名称改为英文试试.
- 解决在Vue项目中时常因为代码缩进导致页面报错的问题
前言 如果我们初次使用vue-cli来构建单页SPA应用,在撸代码的过程中有可能会遇到这种因为代码缩进导致 页面报错的问题,导致我们烦不胜烦.接下来我们就来看一看如何解决这个小问题... erro原因 ...
- Java 8新特性探究(二)深入解析默认方法
什么是默认方法,为什么要有默认方法 简单说,就是接口可以有实现方法,而且不需要实现类去实现其方法.只需在方法名前面加个default关键字即可. 为什么要有这个特性?首先,之前的接口是个双刃剑,好处是 ...
- vux的x-input的源码分析
<template> <div class="vux-x-input weui-cell" :class="{'weui-cell_warn': sho ...
- 原生dom事件注册和移除事件的封装
var addEvent = (function() { var setListener; setListener = false; return function(el, ev, fn) { if ...
- Asp.net core 学习笔记 ( IIS, static file 性能优化 )
更新 : 2019-02-06 最后还是把 rewrite 给替换掉了. 所以 rewrite url 也不依赖 iis 了咯. refer : https://docs.microsoft.com/ ...