uoj#158. 【清华集训2015】静态仙人掌
预处理dfs序,询问转为区间1的个数,用可持久化bitset预处理出所有可能的修改对应哪些位置,然后用一个bitset维护当前每个点的状态,修改时可以用xor实现
#include<bits/stdc++.h>
int _(){
int x=,c=getchar();
while(c<)c=getchar();
while(c>)x=x*+c-,c=getchar();
return x;
}
const int N=;
typedef unsigned long long u64;
typedef u64 block[];
typedef block *bits[];
block pool[N*],*pp=pool;
int n,m,q,fa[N],son[N],dep[N],dl[N],dr[N],cb;
std::vector<int>e[N];
int dfn[N],mxd[N],tk=;
bits f[N],fl[N],fr[N];
void init(){
std::queue<int>q;
q.push();dep[]=;
while(q.size()){
int w=q.front();q.pop();
for(unsigned i=;i<e[w].size();++i){
int u=e[w][i];
if(!dep[u])q.push(u),fa[u]=w,dep[u]=dep[w]+;
else if(dep[u]==dep[w]&&w<u){
for(int x=w,y=u,x0=u,y0=w;x!=y;x=fa[x],y=fa[y]){
dl[x]=dr[y]=;
son[x]=x0,son[y]=y0;
x0=x,y0=y;
}
}
}
}
}
void dfs(int w){
dfn[w]=++tk;
for(unsigned i=;i<e[w].size();++i){
int u=e[w][i];
if(dep[u]>dep[w]&&u!=son[w])dfs(u);
}
mxd[w]=tk;
if(dep[son[w]]>dep[w]&&son[w])dfs(son[w]);
}
void cpy(bits a,bits b,int x){
for(int i=;i<cb;++i)a[i]=b[i];
memcpy(a[x>>]=++pp,b[x>>],sizeof(block));
(*pp)[x>>&]|=1llu<<(x&);
}
void get(int w){
if(f[w][])return;
get(fa[w]);
cpy(f[w],f[fa[w]],dfn[w]);
}
void getr(int);
void getl(int w){
if(fl[w][])return;
int u=dr[w]?son[w]:fa[w];
if(u==fa[w]&&w!=son[u]){
dl[u]?getr(u):getl(u);
cpy(fl[w],dl[u]?fr[u]:fl[u],dfn[w]);
}else{
getl(u);
cpy(fl[w],fl[u],dfn[w]);
}
}
void getr(int w){
if(fr[w][])return;
int u=dl[w]?son[w]:fa[w];
if(u==fa[w]&&w!=son[u]){
dl[u]?getr(u):getl(u);
cpy(fr[w],dl[u]?fr[u]:fl[u],dfn[w]);
}else{
getr(u);
cpy(fr[w],fr[u],dfn[w]);
}
}
u64 ans[];
int test(int x){
return ans[x>>]>>(x&)&;
}
int q0(int l,int r){
int l1=l>>,r1=r>>,s=;
if(l1==r1)for(int i=l;i<=r;++i)s+=test(i);
else{
for(int i=l;(i>>)==l1;++i)s+=test(i);
for(int i=r;(i>>)==r1;--i)s+=test(i);
for(int i=l1+;i<r1;++i){
u64 x=ans[i];
s+=__builtin_popcount(x&0xffffffff);
s+=__builtin_popcount(x>>);
}
}
return r-l+-s;
}
void rev(bits w){
u64*A=ans,*B;
for(int i=;i<cb;++i){
B=*(w[i]);
for(int j=;j<;j+=){
A[]^=B[];A[]^=B[];A[]^=B[];A[]^=B[];
A[]^=B[];A[]^=B[];A[]^=B[];A[]^=B[];
A+=,B+=;
}
}
}
int main(){
n=_();m=_();q=_();
cb=(n+>>)+;
for(int i=;i<cb;++i)f[][i]=fl[][i]=fr[][i]=pp;
for(int i=,a,b;i<=m;++i){
a=_();b=_();
e[a].push_back(b);
e[b].push_back(a);
}
init();
dfs();
for(int i=;i<=n;++i){
get(i);
getl(i);
getr(i);
}
for(int i=;i<=q;++i){
int op=_(),x=_();
if(op==)rev(f[x]);
else if(op==)rev(dl[x]?fr[x]:fl[x]);
else printf("%d\n",q0(dfn[x],mxd[x]));
}
return ;
}
uoj#158. 【清华集训2015】静态仙人掌的更多相关文章
- UOJ #164 [清华集训2015]V (线段树)
题目链接 http://uoj.ac/problem/164 题解 神仙线段树题. 首先赋值操作可以等价于减掉正无穷再加上\(x\). 假设某个位置从前到后的操作序列是: \(x_1,x_2,..., ...
- 清华集训2015 V
#164. [清华集训2015]V http://uoj.ac/problem/164 统计 描述 提交 自定义测试 Picks博士观察完金星凌日后,设计了一个复杂的电阻器.为了简化题目,题目中的常数 ...
- 「清华集训2015」V
「清华集训2015」V 题目大意: 你有一个序列,你需要支持区间加一个数并对 \(0\) 取 \(\max\),区间赋值,查询单点的值以及单点历史最大值. 解题思路: 观察发现,每一种修改操作都可以用 ...
- [UOJ#274][清华集训2016]温暖会指引我们前行
[UOJ#274][清华集训2016]温暖会指引我们前行 试题描述 寒冬又一次肆虐了北国大地 无情的北风穿透了人们御寒的衣物 可怜虫们在冬夜中发出无助的哀嚎 “冻死宝宝了!” 这时 远处的天边出现了一 ...
- UOJ #164. 【清华集训2015】V | 线段树
题目链接 UOJ #164 题解 首先,这道题有三种询问:区间加.区间减(减完对\(0\)取\(\max\)).区间修改. 可以用一种标记来表示--标记\((a, b)\)表示把原来的值加上\(a\) ...
- UOJ#164:【清华集训2015】V
浅谈区间最值操作与历史最值问题:https://www.cnblogs.com/AKMer/p/10225100.html 题目传送门:http://uoj.ac/problem/164 论文题.论文 ...
- 2018.07.28 uoj#164. 【清华集训2015】V(线段树)
传送门 线段树好题. 要求支持的操作: 1.区间变成max(xi−a,0)" role="presentation" style="position: rela ...
- UOJ #164 【清华集训2015】 V
题目链接:V 这道题由于是单点询问,所以异常好写. 注意到每种修改操作都可以用一个标记\((a,b)\)表示.标记\((a,b)\)的意义就是\(x= \max\{x+a,b\}\) 同时这种标记也是 ...
- 【uoj#164】[清华集训2015]V 线段树维护历史最值
题目描述 给你一个长度为 $n$ 的序列,支持五种操作: $1\ l\ r\ x$ :将 $[l,r]$ 内的数加上 $x$ :$2\ l\ r\ x$ :将 $[l,r]$ 内的数减去 $x$ ,并 ...
随机推荐
- Java设计模式(一)
1.什么是设计模式? 在软件工程中,设计模式是对软件设计中普遍存在的各种问题,所提出的 解决方案. 换句话说,设计模式是一套被反复使用.多数人知晓的.经过分类的.代码设计的 经验的总结.使用设计模式是 ...
- PS学习之合成特效:被风沙侵蚀的动物们
素材 大象 尘埃 裂纹 沙子 土地 正式操作: 打开PS 新建一个文件 选国际标准纸张 给分辨率为72(分辨率越大越占内存) 然后确定 将图片旋转90度(图像——旋转——(顺/逆)90度) 下面选 ...
- ACM-ICPC 2018 北京赛区网络预赛(9.22)
#include<bits/stdc++.h> using namespace std; ; *maxn]; *maxn]; *maxn]; int main() { int T; sca ...
- MySQL数据库-数据表、以及列的增删改查
1.创建一个表 CREATE(创建) TABLE(表) ENGINE(引擎) ENGINE=INNODB(引擎)还有很多类引擎,这里只是简单的提一下INNODB引擎,INNODB引擎支持事务(回滚), ...
- 堆栈详解 + 彻底理解Java的值传递和引用传递
本文旨在用最通俗的语言讲述最枯燥的基本知识 学过Java基础的人都知道:值传递和引用传递是初次接触Java时的一个难点,有时候记得了语法却记不得怎么实际运用,有时候会的了运用却解释不出原理,而且坊间讨 ...
- JS中map和foreach的区别以及some和every的用法
一.原生JS forEach()和map()遍历 共同点: 1.都是循环遍历数组中的每一项. 2.forEach() 和 map() 里面每一次执行匿名函数都支持3个参数:数组中的当前项item,当前 ...
- PyMongo 常见问题
PyMongo是线程安全的吗PyMongo是线程安全的,并且为多线程应用提供了内置的连接池 PyMongo是进程安全的吗PyMongo不是进程安全的,如果你在fork()中使用MongoClient实 ...
- 非系统服务如何随系统启动时自动启动(rc.local加了可执行权限,仍然没有生效)
我们知道,例如我们直接yum 安装的httpd mysqld之类的服务可以直接systemctl enable mysql使服务自动启动,但是,我们应该关心的是但是的那部分 例如nginx,我的话,我 ...
- 使用C语言简单模拟Linux的cat程序
先给出源码 //fileio.c #include<stdio.h> #include<stdlib.h> #include<fcntl.h> void print ...
- Map的嵌套使用
Map嵌套Map: 例: AAA: Javas班: 001 熊大 002 熊二 Hdoop班 001 小猪猪 002 小菲菲 ★使用增强for循环遍历Set数组: import java.util.H ...