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. 修改select样式

    CSS就可以解决,原理是将浏览器默认的下拉框样式清除,然后应用上自己的,再附一张向右对齐小箭头的图片即可. select { /*Chrome和Firefox里面的边框是不一样的,所以复写了一下*/ ...

  2. vmware NAT 网络出现问题的解决方法

    nat 网络的配制: 用nat网络相对来说,以后网段出现改变,都不会有大的影响,方便以后做实验. 用dhclient 来获取IP dhclent -r 是用来关闭获取IP的. 自动获取IP,也可以改成 ...

  3. freemarker的template用法

    package cn.itcast.ssm.util; import com.alibaba.fastjson.JSONObject; import freemarker.cache.StringTe ...

  4. Maven命令安装jar包到本地仓库

    https://blog.csdn.net/moxiong3212/article/details/78767480 当需要的jar包在中央仓库找不到或者是想把自己生成的jar包放到的Maven仓库中 ...

  5. golang-build-error

    工程中同时有两个main文件,编译的时候提示: go build proxy/proxy.go pb/anti_spam.pb.go::: cannot find package "_/Us ...

  6. openresty 集成 sentry 异常系统

    sentry 是一个方便的错误异常追踪系统,同时社区也提供了openresty 的lua 包,使用docker-compose 进行测试 备注: sentry 部分的配置来自官方文档 环境准备 doc ...

  7. 递归和非递归分别实现strlen

    思路:strlren主要是字符串是以'\0'为结尾标识来计算字符串的长度,所以要实现自己去写strlen也要从这方面下手. 非递归思想:应用循环的思路,以'\0'为循环结束的标识,每循环一次计数加一. ...

  8. Add task bar to ubuntu

    http://www.howtogeek.com/189819/how-to-add-a-taskbar-to-the-desktop-in-ubuntu-14.04/ sudo apt-get in ...

  9. Percona XtraDB Cluster高可用与状态快照传输(PXC 5.7 )

    Percona XtraDB Cluster(下称PXC)高可用集群支持任意节点在运行期间的重启,升级或者意外宕机,即它解决了单点故障问题.那在这个意外宕机或者重启期间,该节点丢失的数据如何再次进行同 ...

  10. apache的MultipartEntityBuilder文件上传

    本文讲解多文件上传方法,不比较上传有几种方法和效率,而是定向分析apache的httpmime包的MultipartEntityBuilder类,源码包:httpmime-4.5.2.jar 一.常用 ...