【bzoj4551】TJOI2016&HEOI2016树
这题嘛……
子树询问什么的,直接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树的更多相关文章
- [BZOJ4551][TJOI2016&&HEOI2016]树(并查集)
4551: [Tjoi2016&Heoi2016]树 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1746 Solved: 800[Sub ...
- BZOJ4551 Tjoi2016&Heoi2016树(离线+并查集)
似乎是弱化的qtree3.树剖什么的非常无脑.考虑离线.并查集维护每个点的最近打标记祖先,倒序处理,删除标记时将其与父亲合并即可. #include<iostream> #include& ...
- BZOJ4551——[Tjoi2016&Heoi2016]树
1.题意: 给定一颗有根树(根为1),有以下 两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记,其他结点均无标记,而且对于某个 结点,可以打多次标记.)2. 询问操作:询问某个 ...
- [bzoj4551][Tjoi2016][Heoi2016]树
Description 在2016年,佳媛姐姐刚刚学习了树,非常开心. 现在她想解决这样一个问题:给定一颗有根树(根为1),有以下两种操作: 1. 标记操作:对某个结点打上标记(在最开始,只有结点1有 ...
- BZOJ4551: [Tjoi2016&Heoi2016]树
Description 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为1),有以下 两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标 ...
- [bzoj4551][Tjoi2016&Heoi2016]树-树链剖分
Brief Description 给定一颗有根树(根为1),有以下 两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记,其他结点均无标记,而且对于某个 结点,可以打多次标记.) ...
- BZOJ4551[Tjoi2016&Heoi2016]树——dfs序+线段树/树链剖分+线段树
题目描述 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为1),有以下 两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记,其他结点均 ...
- 【BZOJ4551】[Tjoi2016&Heoi2016]树 并查集
[BZOJ4551][Tjoi2016&Heoi2016]树 Description 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为1),有以下两 ...
- BZOJ 4551: [Tjoi2016&Heoi2016]树
4551: [Tjoi2016&Heoi2016]树 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 748 Solved: 394[Subm ...
- BZOJ_4551_[Tjoi2016&Heoi2016]树_树剖+线段树
BZOJ_4551_[Tjoi2016&Heoi2016]树_树剖+线段树 Description 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为 ...
随机推荐
- AngularJS注入依赖路由总结
属性 描述 $dirty 表单有填写记录 $valid 字段内容是合法的 $invalid 字段内容是非法的 $pristine 表单没有填写记录 什么事依赖注入? 依赖注入是一种软件设计模式,在这 ...
- HTML表单之input元素的23种type类型
摘自:http://www.cnblogs.com/xiaohuochai/p/5179909.html 了解HTML表单之input元素的23种type类型 随着HTML5的出现,input元素新增 ...
- [洛谷P3346][ZJOI2015]诸神眷顾的幻想乡
题目大意:给你一棵$n$个点的树,最多有$20$个叶子节点,问共有几个不同的子串 题解:广义$SAM$,对每个叶子节点深搜一次,每个节点的$lst$设为这个节点当时的父亲,这样就可以时建出来的$SAM ...
- UVA.10192 Vacation (DP LCS)
UVA.10192 Vacation (DP LCS) 题意分析 某人要指定旅游路线,父母分别给出了一系列城市的旅游顺序,求满足父母建议的最大的城市数量是多少. 对于父母的建议分别作为2个子串,对其做 ...
- BZOJ2791 Rendezvous
Description给定一个n个顶点的有向图,每个顶点有且仅有一条出边.对于顶点i,记它的出边为(i, a[i]).再给出q组询问,每组询问由两个顶点a.b组成,要求输出满足下面条件的x.y:1. ...
- Eclipse NDK 打印LOG信息(都在jni目录下操作)
http://blog.csdn.net/u013045971/article/details/46448975 1 在.c文件中,引用头文件,定义TAG.LOG宏: #include <and ...
- tinyxml源码解析(上)
转载于:http://www.cnblogs.com/marchtea/archive/2012/11/09/2762669.html 前言: 前段时间做功能可行性的时候简单的使用了tinyxml.在 ...
- 微服务学习一:idea中springboot集成mybatis
一直都想学习微服务,这段时间在琢磨这块的内容,个人之前使用eclipse,现在用intellij idea来进行微服务的开发,个人感觉intellij idea比eclipse更简洁更方便,因为int ...
- C#学习之泛型继承和静态成员
想要理解这里有必要先将泛型类学习充分.这里讲解的是泛型类继承类的类型和静态成员. 在前面C#学习之泛型中,创建的LinkList<T>类实现了IEnumerable<T>接口. ...
- pc扫码支付
https://www.cnblogs.com/shengyu-kmust/p/5228261.html https://pay.weixin.qq.com/wiki/doc/api/native.p ...