传送门

ODTODTODT板子题。

支持子树01覆盖,路径01覆盖,询问一个点的值。


思路:当然可以用树剖+线段树,不过树剖+ODTODTODT也可以很好的水过去。

注意修改路径时每次跳重链都要修改。

不会ODTODTODT的点这里

代码:

#include<bits/stdc++.h>
#define ri register int
using namespace std;
inline int read(){
    int ans=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
    return ans;
}
const int N=5e5+5;
int top[N],hson[N],siz[N],dep[N],num[N],fa[N],tot=0,n;
vector<int>e[N];
struct Node{
    int l,r;
    mutable bool v;
    Node(int l,int r=-1,bool v=0):l(l),r(r),v(v){}
    friend inline bool operator<(const Node&a,const Node&b){return a.l<b.l;}
};
set<Node>S;
typedef set<Node>::iterator It;
inline It split(int pos){
    It it=S.lower_bound(Node(pos));
    if(it!=S.end()&&it->l==pos)return it;
    --it;
    int l=it->l,r=it->r;
    bool v=it->v;
    return S.erase(it),S.insert(Node(l,pos-1,v)),S.insert(Node(pos,r,v)).first;
}
inline void assign(int l,int r,bool v){
    It R=split(r+1),L=split(l);
    S.erase(L,R),S.insert((Node){l,r,v});
}
inline bool query(int pos){
    It it=S.lower_bound(Node(pos));
    if(it!=S.end()&&it->l==pos)return it->v;
    return --it,it->v;
}
void dfs1(int p){
    siz[p]=1;
    for(ri i=0,v;i<e[p].size();++i){
        if((v=e[p][i])==fa[p])continue;
        dep[v]=dep[p]+1,fa[v]=p,dfs1(v),siz[p]+=siz[v];
        if(siz[v]>siz[hson[p]])hson[p]=v;
    }
}
void dfs2(int p,int tp){
    top[p]=tp,num[p]=++tot;
    if(!hson[p])return;
    dfs2(hson[p],tp);
    for(ri i=0,v;i<e[p].size();++i)if((v=e[p][i])!=fa[p]&&v!=hson[p])dfs2(v,v);
}
inline void change(int x){
    while(top[x]^1)assign(num[top[x]],num[x],0),x=fa[top[x]];
    assign(1,num[x],0);
}
int main(){
    S.insert(Node(1,n=read(),0));
    for(ri i=1,u,v;i<n;++i)u=read(),v=read(),e[u].push_back(v),e[v].push_back(u);
    dfs1(1),dfs2(1,1);
    for(ri tt=read(),op,x;tt;--tt){
        op=read(),x=read();
        switch(op){
            case 1:assign(num[x],num[x]+siz[x]-1,1);break;
            case 2:change(x);break;
            default:cout<<query(num[x])<<'\n';
        }
    }
    return 0;
}

最新文章

  1. 为什么我不建议你做APP?
  2. Yocto开发笔记之《串口驱动调试》(QQ交流群:519230208)
  3. SAP 批量查看凭证更改记录
  4. Floodlight 防火墙是如何起作用的
  5. lintcode : 二叉树的序列化和反序列化
  6. Java Socket(1): 入门
  7. CF 13E. Holes 分块数组
  8. gitweb安装
  9. 总结自己的Git常用命令
  10. [bzoj 2243]: [SDOI2011]染色 [树链剖分][线段树]
  11. 201521123054 《Java程序设计》 第十周学习总结
  12. 怎么让普通用户使用root权限执行用户命令
  13. deeplearning.ai 神经网络和深度学习 week3 浅层神经网络 听课笔记
  14. javascript form表单常用的正则表达式
  15. linux的dd命令
  16. BZOJ 2730 矿场搭建
  17. (贪心 优先队列)P1090合并果子 洛谷
  18. vue中axios 配置请求拦截功能 及请求方式如何封装
  19. 配置wbepack
  20. JAVA中对List&lt;Map&lt;String,Object&gt;&gt;中的中文汉字进行排序

热门文章

  1. Q in Q
  2. 民生银行十五年的数据体系建设,深入解读阿拉丁大数据生态圈、人人BI 是如何养成的?【转】
  3. django的中间件:process_request|process_response|process_view|process_exception
  4. [leetcode]449. Serialize and Deserialize BST序列化反序列化二叉搜索树(尽量紧凑)
  5. springboot 日志2
  6. os模块。笔记
  7. 移动端页面返回,数据不刷新bug解决
  8. vue2.0跨域携带cookie和IE兼容
  9. InstallShield 2015 安装 在vs2015
  10. 在浏览器中运行java applet