http://uoj.ac/problem/158

预处理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】静态仙人掌的更多相关文章

  1. UOJ #164 [清华集训2015]V (线段树)

    题目链接 http://uoj.ac/problem/164 题解 神仙线段树题. 首先赋值操作可以等价于减掉正无穷再加上\(x\). 假设某个位置从前到后的操作序列是: \(x_1,x_2,..., ...

  2. 清华集训2015 V

    #164. [清华集训2015]V http://uoj.ac/problem/164 统计 描述 提交 自定义测试 Picks博士观察完金星凌日后,设计了一个复杂的电阻器.为了简化题目,题目中的常数 ...

  3. 「清华集训2015」V

    「清华集训2015」V 题目大意: 你有一个序列,你需要支持区间加一个数并对 \(0\) 取 \(\max\),区间赋值,查询单点的值以及单点历史最大值. 解题思路: 观察发现,每一种修改操作都可以用 ...

  4. [UOJ#274][清华集训2016]温暖会指引我们前行

    [UOJ#274][清华集训2016]温暖会指引我们前行 试题描述 寒冬又一次肆虐了北国大地 无情的北风穿透了人们御寒的衣物 可怜虫们在冬夜中发出无助的哀嚎 “冻死宝宝了!” 这时 远处的天边出现了一 ...

  5. UOJ #164. 【清华集训2015】V | 线段树

    题目链接 UOJ #164 题解 首先,这道题有三种询问:区间加.区间减(减完对\(0\)取\(\max\)).区间修改. 可以用一种标记来表示--标记\((a, b)\)表示把原来的值加上\(a\) ...

  6. UOJ#164:【清华集训2015】V

    浅谈区间最值操作与历史最值问题:https://www.cnblogs.com/AKMer/p/10225100.html 题目传送门:http://uoj.ac/problem/164 论文题.论文 ...

  7. 2018.07.28 uoj#164. 【清华集训2015】V(线段树)

    传送门 线段树好题. 要求支持的操作: 1.区间变成max(xi−a,0)" role="presentation" style="position: rela ...

  8. UOJ #164 【清华集训2015】 V

    题目链接:V 这道题由于是单点询问,所以异常好写. 注意到每种修改操作都可以用一个标记\((a,b)\)表示.标记\((a,b)\)的意义就是\(x= \max\{x+a,b\}\) 同时这种标记也是 ...

  9. 【uoj#164】[清华集训2015]V 线段树维护历史最值

    题目描述 给你一个长度为 $n$ 的序列,支持五种操作: $1\ l\ r\ x$ :将 $[l,r]$ 内的数加上 $x$ :$2\ l\ r\ x$ :将 $[l,r]$ 内的数减去 $x$ ,并 ...

随机推荐

  1. lesson5rnns-fastai

    32min 如何确定embedding个数即嵌入矩阵容量?:不确定:与文本的字数关系不大,关键是语言的复杂度和需要解决的问题类型 embedding的效果要比one hot编码的效果好

  2. linux 执行脚本

    crontab -e 直接编辑定时脚本 保存后,在/var/spool/cron/下自动生成一个以用户名命名的脚本文件.

  3. C++学习(三十)(C语言部分)之 栈和队列

    数据结构1.保存数据 2.处理数据数组+操作增查删改 栈和队列是一种操作受限的线性表 栈 是先进后出 是在一端进行插入删除的操作--->栈顶 另一端叫做栈底(栈和栈区是两个概念)(是一种数据结构 ...

  4. python------模块定义、导入、优化 ------time模块

    1.模块介绍 2.time & datetime 3.random 4.os 5.sys 6.shutil 7.json & pickle 8.shelve 9.xml处理 10.ya ...

  5. 如何查看你的VPS是什么虚拟化架构?

    使用virt-what即可了 CentOS安装 virt-what yum install virt-what Debian/ubuntu 安装 virt-what apt-get install v ...

  6. JS 数组常用的方法

    数组常用的方法: x.toString()方法:任何对象都有toString方法.        将任何对象转为字符串. 一般不主动调用,系统在需要时自动调用 x.valueOf()方法:同toStr ...

  7. NK实习项目配置

    1.复制eclipse和项目 2.配置tomcat6,现在只能用tomcat6 3.tomcat6插件eclipse是默认有的,只需要配置一下 http://blog.csdn.net/u014079 ...

  8. static关键字的使用(有个深刻领悟)

    没有实例化对象的时候进行可以调用static 属性  static方法 (用类名去调用) 非static定义的方法可以调用static的属性或方法. static定义的方法不能调用非static的方法 ...

  9. xencenter如何安装Centos7虚拟机系统

    xencenter的ip地址192.168.245.134(win10系统) 首先我们在win10系统安装好xencenter(这个软件可以直接在xenserver启动后,通过访问xenserver的 ...

  10. IO流的序列化和反序列化

    序列化和反序列化的概念: 序列化:把对象转换为字节序列的过程称为对象的序列化.(常见的就是存文件) 反序列化:把字节序列恢复为对象的过程称为对象阿德反序列化. 序列化和反序列化的使用: java.io ...