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$ ,并 ...
随机推荐
- 优先队列(挑程)poj 2431
每次写poj的题都很崩溃,貌似从来没有一次一发就ac的,每次都有特别多的细节需要考虑.还有就是自己写的太粗糙了,应该把每种情况都想到的,总是急着交,然后刷一页wa. 优先队列直接用stl就可以,简单实 ...
- pc端复制方法
dom结构如下: <div id="btn">复制</div> <input id="content" type="te ...
- SSAS aggregation 的作用及其使用
作用: 聚合是为了解决查询在运行时的效率低下,在数据立方体部署的时候进行聚合,实际上是对数据立方体的预处理,方便以后查询.如若在部署时未进行聚合,则在以后每次查询时实际上都会进行一次集合的操作,等待结 ...
- opencv学习记录
#include<iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui ...
- 小米4c刷LineageOS
注意,本文仅限于小米4c,其他手机仅可参考步骤.如下rom,su,gapps包的下载都是小米4c的,深刷miflash也仅适用于小米手机.准备工作:请自行备份好手机内的个人资料. 电脑环境,usb驱动 ...
- EasyUI datagrid 查询、设置、提交 三
查询 $(“#grid”).datagrid(“load”,{ a: $('#id').val(),b :$('#text').val() }); {} 里面可以 是序列化参数 $(“#grid ...
- Spring 中的接口知识整理
本想每个小知识一篇随笔,但是那样,看起来有些单薄,所以,就放在一片文章里了.而且,以后还会慢慢在最后不断的追加. 目录: FactoryBean BeanPostProcessor 1.Factory ...
- day39KNN算法和其他的算法
PS: 1.现在明白为什么其他的同学一直都在做数字图像处理,matlab这种东西了,因为机器学习,其他底层主要是做预先处理,然后调用某一个算法 2.感觉knn算法就是根据先验数据计算下一个跟自己一样不 ...
- 统计cpu相关信息
我的cpu为i3310m 适用类型:笔记本 CPU系列:酷睿i3 3代系列 CPU主频:2.4GHz 三级缓存:3MB 插槽类型:FCBGA1023,FCPGA988 封装大小:37.5×37.5mm ...
- 收藏一篇 Python 文本框操作命令
原文地址:https://www.cnblogs.com/onlyfu/archive/2013/03/07/2947473.html 属性(Options) background(bg) borde ...