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. 软件工程 week 01

    一.安装与使用Git First项目地址: https://git.coding.net/kefei101/First.git 二.针对以下三个问题,作为大三新生,谈谈我的感想 问题1:你为什么选择计 ...

  2. 【湖南师范大学2018年大学生程序设计竞赛新生赛 L】【HDOJ2476】【区间DP】

    https://www.nowcoder.com/acm/contest/127/L L 小小粉刷匠 题目描述 "lalala,我是一个快乐的粉刷匠",小名一边快活地唱着歌,一边开 ...

  3. Vim+Ctags+Cscope安装

    对比了下,感觉还是Vim比较专业. 一:使用说明: ‘/’查找忽略大小写,比如需要查找“book”,当输入/b的时候会自动找到第一个以"b"开头的单词 实现C程序的缩减 查询中自由 ...

  4. MVVM在WPF中应用(1)

    在软件行业浸润了这么多年,第一次在MES的工厂里从事软件开发. 在这里的感觉就是安静.宽松,比在那些专门以软件为主的企业中轻松自在.在这里的第一个项目是关于数据的导入和导出,还有数据的比较这些功能. ...

  5. linux查看网络信息命令

    #遇到一条很长的命令怎么办,想换行的时候在末尾增加\符号就可以换行继续输入命令了 #在ifconfig内容中找出ip [root@bogon ~]# ifconfig ens33|grep " ...

  6. sqler sql 转rest api 的docker 镜像构建(续)使用源码编译

    sqler 在社区的响应还是很不错的,已经添加了好多数据库的连接,就在早上项目的包管理还没有写明确, 下午就已经有go mod 构建的支持了,同时也调整下docker 镜像的构建,直接使用git cl ...

  7. Using pointer to access array instead of index

    See example below firstly. uint8_t parity = ; uint8_t index = ; //flag gMUXTask.responseData[index++ ...

  8. react-redux 知识点

    React-Redux 使用 如果只使用redux,那么流程是这样的: component --> dispatch(action) --> reducer --> subscrib ...

  9. Scala实战

    1. Eclipse中设置scala调试器 scala的调试器要选择Scala Application(new debuger)Launcher:开始选择图省事,选择了一个字母少的,亲切的Launch ...

  10. java 字符集 Charset

    字符集就是为每个字符编个号码.如ASCII编码中,字符 'A' 的号码为 65 (或二进制01000001):GBK编码中,字符 '国' 对应的号码为47610 . 编码:将字符序列转换成二进制序列. ...