Description

在2016年,佳媛姐姐刚刚学习了树,非常开心。现在他想解决这样一个问题:给定一颗有根树(根为1),有以下
两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记,其他结点均无标记,而且对于某个
结点,可以打多次标记。)2. 询问操作:询问某个结点最近的一个打了标记的祖先(这个结点本身也算自己的祖
先)你能帮帮他吗?

Input

输入第一行两个正整数N和Q分别表示节点个数和操作次数接下来N-1行,每行两个正整数u,v(1≤u,v≤n)表示u到v
有一条有向边接下来Q行,形如“opernum”oper为“C”时表示这是一个标记操作,oper为“Q”时表示这是一个询
问操作对于每次询问操作,1 ≤ N, Q ≤ 100000。

Output

输出一个正整数,表示结果

Sample Input

5 5
1 2
1 3
2 4
2 5
Q 2
C 2
Q 2
Q 5
Q 3

Sample Output

1
2
2
1
 
丝帛数据结构题,考虑使用dfs序来解决这个问题,那么第一个操作对应区间内答案与val取max,第二个操作对应单点询问,用棵线段树打标记就行了。
  1. #include<cstdio>
  2. #include<cctype>
  3. #include<queue>
  4. #include<cstring>
  5. #include<algorithm>
  6. #define rep(i,s,t) for(int i=s;i<=t;i++)
  7. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  8. #define ren for(int i=first[x];i;i=next[i])
  9. using namespace std;
  10. const int BufferSize=1<<16;
  11. char buffer[BufferSize],*head,*tail;
  12. inline char Getchar() {
  13. if(head==tail) {
  14. int l=fread(buffer,1,BufferSize,stdin);
  15. tail=(head=buffer)+l;
  16. }
  17. return *head++;
  18. }
  19. inline int read() {
  20. int x=0,f=1;char c=Getchar();
  21. for(;!isdigit(c);c=Getchar()) if(c=='-') f=-1;
  22. for(;isdigit(c);c=Getchar()) x=x*10+c-'0';
  23. return x*f;
  24. }
  25. const int maxn=100010;
  26. int n,m,first[maxn],next[maxn<<1],to[maxn<<1],e;
  27. void AddEdge(int u,int v) {
  28. to[++e]=v;next[e]=first[u];first[u]=e;
  29. to[++e]=u;next[e]=first[v];first[v]=e;
  30. }
  31. int dep[maxn],st[maxn],en[maxn],cnt;
  32. int better(int x,int y) {return dep[x]<dep[y]?y:x;}
  33. void dfs(int x,int fa) {
  34. dep[x]=dep[fa]+1;st[x]=++cnt;
  35. ren if(to[i]!=fa) dfs(to[i],x);
  36. en[x]=cnt;
  37. }
  38. int setv[maxn<<2];
  39. void update(int o,int l,int r,int ql,int qr,int val) {
  40. if(ql<=l&&r<=qr) setv[o]=better(setv[o],val);
  41. else {
  42. int mid=l+r>>1,lc=o<<1,rc=lc|1;
  43. if(ql<=mid) update(lc,l,mid,ql,qr,val);
  44. if(qr>mid) update(rc,mid+1,r,ql,qr,val);
  45. }
  46. }
  47. int query(int o,int l,int r,int p) {
  48. if(l==r) return setv[o];
  49. int mid=l+r>>1,lc=o<<1,rc=lc|1,ans=setv[o];
  50. if(p<=mid) ans=better(ans,query(lc,l,mid,p));
  51. else ans=better(ans,query(rc,mid+1,r,p));
  52. return ans;
  53. }
  54. int main() {
  55. n=read();m=read();
  56. rep(i,2,n) AddEdge(read(),read());
  57. dfs(1,0);update(1,1,n,1,n,1);
  58. while(m--) {
  59. char c=Getchar();
  60. while(!isalpha(c)) c=Getchar();
  61. int x=read();
  62. if(c=='Q') printf("%d\n",query(1,1,n,st[x]));
  63. else update(1,1,n,st[x],en[x],x);
  64. }
  65. return 0;
  66. }

  

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]树-树链剖分

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

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

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

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

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

  8. BZOJ 4551: [Tjoi2016&Heoi2016]树

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

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

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

随机推荐

  1. python面向对象进阶 反射 单例模式 以及python实现类似java接口功能

    本篇将详细介绍Python 类的成员.成员修饰符.类的特殊成员. 类的成员 类的成员可以分为三大类:字段.方法和特性. 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存 ...

  2. 百度编辑器UEditor ASP.NET示例Demo 分类: ASP.NET 2015-01-12 11:18 346人阅读 评论(0) 收藏

    在百度编辑器示例代码基础上进行了修改,封装成类库,只需简单配置即可使用. 完整demo下载 版权声明:本文为博主原创文章,未经博主允许不得转载.

  3. Auto Layout

    Auto Layout XCode5+ Auto Layout Concepts 核心的概念是约束. Constraint Basics Constant value Relation Priorit ...

  4. jquery获取和设置元素高度宽度

    jquery获取和设置元素高度宽度 1.height()/ width() 取得第一个匹配元素当前计算的高度/宽度值(px) height(val)/ width(val) 为每个匹配的元素设置CSS ...

  5. [CentOS]安装软件:/lib/ld-linux.so.2: bad ELF interpreter解决

    转自:http://blog.csdn.net/wanglei2258/article/details/24961233 [CentOS]安装软件:/lib/ld-linux.so.2: bad EL ...

  6. Sizeof运算符小结

    以下内容援引自<C Primer Plus>中文版第五版Page95 Sizeof运算符以字节为单位返回其操作数的大小.(在C中,1个字节被定义为char类型所占用空间的大小.在过去,1个 ...

  7. 注解:【无连接表的】Hibernate单向1->N关联

    Person与Address关联:单向1->N,[无连接表的] (性能较低,不推荐使用!) Person.java package org.crazyit.app.domain; import ...

  8. eclipse文本编码格式修改为UTF-8 (转)

    如果要使插件开发应用能有更好的国际化支持,能够最大程度的支持中文输出,则最好使 Java文件使用UTF-8编码.然而,Eclipse工作空间(workspace)的缺省字符编码是操作系统缺省的编码,简 ...

  9. ObCallback回调钩子检测

    ObCallback回调钩子检测 2013-12-20 Nie.Meining Ring0 在 PatchGuard 的摧残下,通过 ObRegisterCallbacks 函数注册回调钩子已经成了 ...

  10. JAVA第三周作业

    一:枚举 package homework; public class EnumTest { public static void main(String[] args) { Size s=Size. ...