NOIP太可怕了((( -口-)

题目链接

【题目大意】

给定一颗有根树(根为1),有以下两种操作:

1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记,其他结点均无标记,而且对于某个结点,可以打多次标记。)

2. 询问操作:询问某个结点最近的一个打了标记的祖先(这个结点本身也算自己的祖先)
 
【思路】
正着做不行就反方向来。先离线处理所有操作,算出最终某个点被标记了几次。跑一次dfs算出最终状态时每个点最近的打了标记的祖先u[i]。
从后往前重新看操作,如果是标记操作,那么当前节点标记数-1,如果标记数为0了,那么u[i]=fa[i]最近的祖先(用并查集来处理之前的更新)。如果为询问,则输出当前最近的祖先(同样可以用并查集来做)。
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int MAXN=+;
  4. vector<int> E[MAXN];
  5. int mark[MAXN];
  6. int query[MAXN],ans[MAXN];
  7. int u[MAXN],fa[MAXN],n,q;
  8. char op[MAXN];
  9.  
  10. void dfs(int x,int anc,int father)
  11. {
  12. fa[x]=father;
  13. if (mark[x]>) u[x]=x;
  14. else u[x]=anc;
  15. for (int i=;i<E[x].size();i++)
  16. {
  17. int to=E[x][i];
  18. if (to==fa[x]) continue;
  19. dfs(to,u[x],x);
  20. }
  21. }
  22.  
  23. int union_set(int x)
  24. {
  25. int r=x;
  26. while (u[r]!=r) r=u[r];
  27. int now=x;
  28. while (u[now]!=r)
  29. {
  30. int tmp=u[now];
  31. u[now]=r;
  32. now=tmp;
  33. }
  34. return u[x];
  35. }
  36.  
  37. void init()
  38. {
  39. scanf("%d%d",&n,&q);
  40. for (int i=;i<n;i++)
  41. {
  42. int u,v;
  43. scanf("%d%d",&u,&v);
  44. E[u].push_back(v);
  45. E[v].push_back(u);
  46. }
  47. mark[]=;
  48. for (int i=;i<=q;i++)
  49. {
  50. char tmp[];
  51. scanf("%s %d",tmp,&query[i]);
  52. if (tmp[]=='C') mark[query[i]]++;
  53. op[i]=tmp[];
  54. }
  55. dfs(,,);
  56. for (int i=;i<=n;i++) cout<<u[i]<<endl;
  57. }
  58.  
  59. void solve()
  60. {
  61. memset(ans,,sizeof(ans));
  62. for (int i=q;i>=;i--)
  63. {
  64. int now=query[i];
  65. if (op[i]=='C')
  66. {
  67. mark[now]--;
  68. if (!mark[now]) now=union_set(fa[now]);
  69. }
  70. else ans[++ans[]]=union_set(now);
  71. }
  72. for (int i=ans[];i>=;i--) printf("%d\n",ans[i]);
  73. }
  74.  
  75. int main()
  76. {
  77. init();
  78. solve();
  79. return ;
  80. }

【并查集】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 ...

随机推荐

  1. ORACLE递归查询(适用于ID,PARENTID结构数据表)

    Oracle 树操作(select…start with…connect by…prior) oracle树查询的最重要的就是select…start with…connect by…prior语法了 ...

  2. java取得当前日期增加一天或多天

    代码如下: SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd"); Calendar c = Calendar.getI ...

  3. bzoj千题计划228:bzoj2095: [Poi2010]Bridges

    http://www.lydsy.com/JudgeOnline/problem.php?id=2095 二分答案,判断是否存在混合图的欧拉回路 如果只有一个方向的风力<=mid,这条边就是单向 ...

  4. 将网页设置为允许 XMLHttpRequest 跨域访问

    在非IE下,使用XMLHttpRequest 不能跨域访问, 除非要访问的网页设置为允许跨域访问. 将网页设置为允许跨域访问的方法如下: Java Response.AddHeader("A ...

  5. XMPP用户登录

    CHENYILONG Blog XMPP用户登录 技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/luohanchenyilon ...

  6. Sortable.js参数

    所有的事件回调函数都有两个参数:event和ui,浏览器自有event对象,和经过封装的ui对象ui.helper - 表示sortable元素的JQuery对象,通常是当前元素的克隆对象ui.pos ...

  7. F. Ivan and Burgers(线性基,离线)

    题目链接:http://codeforces.com/contest/1100/problem/F 题目大意:首先输入n,代表当前有n个数,然后再输入m,代表m次询问,每一次询问是询问区间[l,r], ...

  8. 【Python】【持续项目】Python-安全项目搜集

    1.前言 Python发展以来,除了web安全方向,二进制方向也早已经积累有很多用Python写的项目.作为搜集者当然不能错过! 2.项目分类 安全编程 多功能Python键盘记录工具:Radium ...

  9. git学习——Git 基础要点【转】

    转自:http://blog.csdn.net/zeroboundary/article/details/10549555 简单地说,Git 究竟是怎样的一个系统呢?请注意,接下来的内容非常重要,若是 ...

  10. js async await 终极异步解决方案

    既然有了promise 为什么还要有async await ? 当然是promise 也不是完美的异步解决方案,而 async await 的写法看起来更加简单且容易理解. 回顾 Promise Pr ...