这题嘛……

子树询问什么的,直接dfs序线段树无脑写,是吧……

然后几分钟之内zcy就写出了这样的东西:

#include<bits/stdc++.h>
#define N 100005
#define lson (o<<1)
#define rson (o<<1|1)
using namespace std;
int n,m,cnt,tot,head[N],a[N];
struct Edge{int u,v,next;}G[N<<];
int lpos[N],rpos[N],d[N],fa[N];
inline void addedge(int u,int v){
G[++tot].u=u;G[tot].v=v;G[tot].next=head[u];head[u]=tot;
G[++tot].u=v;G[tot].v=u;G[tot].next=head[v];head[v]=tot;
}
void dfs(int u,int f){
lpos[u]=++cnt;
for(int i=head[u];i;i=G[i].next){
int v=G[i].v;if(v==f)continue;
fa[v]=u;d[v]=d[u]+;
dfs(v,u);
}
rpos[u]=cnt;
}
inline int mmp(int x,int y){return d[x]>d[y]?x:y;}
struct Segment_Tree{
int tagv[N<<],maxv[N<<];
inline void pushup(int o){maxv[o]=max(maxv[lson],maxv[rson]);}
inline void puttag(int o,int x){tagv[o]=mmp(tagv[o],x);maxv[o]=mmp(maxv[o],x);}
inline void pushdown(int o){
if(!tagv[o])return;
puttag(lson,tagv[o]);puttag(rson,tagv[o]);
tagv[o]=;
}
void build(int o,int l,int r){
tagv[o]=;maxv[o]=;if(l==r)return;
int mid=(l+r)>>;
build(lson,l,mid);build(rson,mid+,r);
}
void change(int o,int l,int r,int ql,int qr,int v){
if(ql<=l&&r<=qr){puttag(o,v);return;}
int mid=(l+r)>>;pushdown(o);
if(ql<=mid)change(lson,l,mid,ql,qr,v);
if(qr>mid)change(rson,mid+,r,ql,qr,v);
pushup(o);
}
int querymax(int o,int l,int r,int q){
if(l==r)return maxv[o];
int mid=(l+r)>>;pushdown(o);
if(q<=mid)return querymax(lson,l,mid,q);
if(q>mid)return querymax(rson,mid+,r,q);
}
}T;
inline int read(){
int f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
int main(){
n=read();m=read();
for(int i=;i<n;i++){
int u=read(),v=read();
addedge(u,v);
}
dfs(,);T.build(,,n);
char s[];
while(m--){
scanf("%s",s);int x=read();
if(s[]=='C')T.change(,,n,lpos[x],rpos[x],x);
else printf("%d\n",T.querymax(,,n,lpos[x]));
}
}

对于sb的我来说,写这种模版最快不过了……
在真正的省选考场上,写这种东西的选手恐怕也是最多,写起来也是最稳的吧……

然而其实还有一种O(na(n))的做法吊打我。

就是巧妙地离线用并查集维护标记,当作连通性维护……

orz

反正要是我去省选怕是想不出的吧……

#include<bits/stdc++.h>
#define N 100005
using namespace std;
int n,m,tot,head[N],c[N],a[N],fa[N],f[N],ans[N];
char s[N];
struct Edge{int u,v,next;}G[N<<];
inline void addedge(int u,int v){
G[++tot].u=u;G[tot].v=v;G[tot].next=head[u];head[u]=tot;
G[++tot].u=v;G[tot].v=u;G[tot].next=head[v];head[v]=tot;
}
int find(int x){return x==f[x]?x:f[x]=find(f[x]);}
void dfs(int u){
f[u]=c[u]?u:fa[u];
for(int i=head[u];i;i=G[i].next){
int v=G[i].v;if(v!=fa[u])fa[v]=u,dfs(v);
}
}
inline int read(){
int f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
int main(){
n=read();m=read();
for(int i=;i<n;i++){
int u=read(),v=read();
addedge(u,v);
}c[]=;
for(int i=;i<=m;i++){
do{s[i]=getchar();}while(s[i]!='C'&&s[i]!='Q');
a[i]=read();
if(s[i]=='C')c[a[i]]++;
}
dfs();
for(int i=m;i;i--){
if(s[i]=='C'){c[a[i]]--;if(!c[a[i]])f[a[i]]=fa[a[i]];}
else ans[i]=find(a[i]);
}
for(int i=;i<=m;i++)if(ans[i])printf("%d\n",ans[i]);
}

【bzoj4551】TJOI2016&HEOI2016树的更多相关文章

  1. [BZOJ4551][TJOI2016&&HEOI2016]树(并查集)

    4551: [Tjoi2016&Heoi2016]树 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1746  Solved: 800[Sub ...

  2. BZOJ4551 Tjoi2016&Heoi2016树(离线+并查集)

    似乎是弱化的qtree3.树剖什么的非常无脑.考虑离线.并查集维护每个点的最近打标记祖先,倒序处理,删除标记时将其与父亲合并即可. #include<iostream> #include& ...

  3. BZOJ4551——[Tjoi2016&Heoi2016]树

    1.题意: 给定一颗有根树(根为1),有以下 两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记,其他结点均无标记,而且对于某个 结点,可以打多次标记.)2. 询问操作:询问某个 ...

  4. [bzoj4551][Tjoi2016][Heoi2016]树

    Description 在2016年,佳媛姐姐刚刚学习了树,非常开心. 现在她想解决这样一个问题:给定一颗有根树(根为1),有以下两种操作: 1. 标记操作:对某个结点打上标记(在最开始,只有结点1有 ...

  5. BZOJ4551: [Tjoi2016&Heoi2016]树

    Description 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为1),有以下 两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标 ...

  6. [bzoj4551][Tjoi2016&Heoi2016]树-树链剖分

    Brief Description 给定一颗有根树(根为1),有以下 两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记,其他结点均无标记,而且对于某个 结点,可以打多次标记.) ...

  7. BZOJ4551[Tjoi2016&Heoi2016]树——dfs序+线段树/树链剖分+线段树

    题目描述 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为1),有以下 两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记,其他结点均 ...

  8. 【BZOJ4551】[Tjoi2016&Heoi2016]树 并查集

    [BZOJ4551][Tjoi2016&Heoi2016]树 Description 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为1),有以下两 ...

  9. BZOJ 4551: [Tjoi2016&Heoi2016]树

    4551: [Tjoi2016&Heoi2016]树 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 748  Solved: 394[Subm ...

  10. BZOJ_4551_[Tjoi2016&Heoi2016]树_树剖+线段树

    BZOJ_4551_[Tjoi2016&Heoi2016]树_树剖+线段树 Description 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为 ...

随机推荐

  1. cf Round 587

    A.Duff and Weight Lifting(思维) 显然题目中只有一种情况可以合并 2^a+2^a=2^(a+1).我们把给出的mi排序一下,模拟合并操作即可. # include <c ...

  2. POJ3690:Constellations——题解

    http://poj.org/problem?id=3690 题目大意:给一个图和几个子图,判断有多少种子图在原图出现过. —————————————————————— 二维哈希即可,操作看代码,我觉 ...

  3. BZOJ5011 & 洛谷4065 & LOJ2275:[JXOI2017]颜色——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5011 https://www.luogu.org/problemnew/show/P4065 ht ...

  4. BZOJ2844:albus就是要第一个出场——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=2844 已知一个长度为n的正整数序列A(下标从1开始), 令 S = { x | 1 <= x ...

  5. AOJ.720 丢失的学妹

    缺失的学妹 考察点 STL MAP Time Mem Len Lang 3.81s 39.1MB 0.68K G++ 题意分析 给出妹子学号的个数n,给出n个学号,和n-1个学号,求在n学号中那个没有 ...

  6. React Render Callback Pattern(渲染回调模式)

    React Render Callback Pattern,渲染回调模式,其实是将this.props.children当做函数来调用. 例如: 要根据user参数确定渲染Loading还是Profi ...

  7. bzoj1024: [SCOI2009]生日快乐(DFS)

    dfs(x,y,n)表示长为x,宽为y,切n块 每次砍的一定是x/n的倍数或者y/n的倍数 #include<bits/stdc++.h> using namespace std; con ...

  8. HDU 4417 离线+树状数组

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  9. C#或ASP.NET绘图初探

    C#或ASP.NET的简单绘图 public void ProcessRequest (HttpContext context) { context.Response.ContentType = &q ...

  10. HDU 3277 最大流+二分

    Marriage Match III Time Limit: 10000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...