传送门

题意:

单点修改,求一条链的mex


分块维护权值,$O(1)$修改$O(S)$求mex......

带修改树上莫队

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cstring>
  5. #include <cmath>
  6. using namespace std;
  7. typedef long long ll;
  8. const int N=5e4+;
  9. inline int read(){
  10. char c=getchar();int x=,f=;
  11. while(c<''||c>''){if(c=='-')f=-;c=getchar();}
  12. while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
  13. return x*f;
  14. }
  15.  
  16. int n,Q,a[N],t[N],op,x,y;
  17. struct edge{int v,ne;} e[N<<];
  18. int cnt,h[N];
  19. inline void ins(int u,int v){
  20. e[++cnt]=(edge){v,h[u]}; h[u]=cnt;
  21. e[++cnt]=(edge){u,h[v]}; h[v]=cnt;
  22. }
  23. int block, pos[N], m, st[N], top;
  24. int fa[N][], deep[N];
  25. void dfs(int u){
  26. for(int i=; (<<i)<=deep[u]; i++)
  27. fa[u][i]=fa[ fa[u][i-] ][i-];
  28. int bot=top;
  29. for(int i=h[u];i;i=e[i].ne) if(e[i].v!=fa[u][]){
  30. fa[e[i].v][]=u; deep[e[i].v]=deep[u]+;
  31. dfs(e[i].v);
  32. if(top-bot>=block){
  33. m++;
  34. while(top!=bot) pos[st[top--]]=m;
  35. }
  36. }
  37. st[++top]=u;
  38. }
  39. inline int lca(int x,int y){
  40. if(deep[x]<deep[y]) swap(x, y);
  41. int bin=deep[x]-deep[y];
  42. for(int i=;i<;i++) if((<<i)&bin) x=fa[x][i];
  43. if(x==y) return x;
  44. for(int i=;i>=;i--)
  45. if(fa[x][i]!=fa[y][i]) x=fa[x][i], y=fa[y][i];
  46. return x==y ? x : fa[x][];
  47. }
  48.  
  49. struct cmeow{int u, next, last;}cq[N];
  50. struct meow{
  51. int u, v, tim, id;
  52. bool operator <(const meow &a) const {
  53. return pos[u]==pos[a.u] ? (pos[v]==pos[a.v] ? tim<a.tim : pos[v]<pos[a.v]) : pos[u]<pos[a.u];
  54. }
  55. }q[N];
  56. int p, tim, u, v, cur, ans[N], vis[N];
  57.  
  58. struct Block{
  59. int n,pos[N],m,block;
  60. struct _blo{int l,r;} b[];
  61. void ini(){
  62. block=sqrt(n); m=(n-)/block+;
  63. for(int i=;i<=n;i++) pos[i]=(i-)/block+;
  64. for(int i=;i<=m;i++) b[i].l=(i-)*block+, b[i].r=i*block;
  65. b[m].r=n;
  66. }
  67. int cou[N], sum[];
  68. inline void add(int v) { if(v<=n) sum[pos[v]]+= (++cou[v])==; }
  69. inline void del(int v) { if(v<=n) sum[pos[v]]-= (--cou[v])==; }
  70. inline int mex(){
  71. for(int i=;i<=m;i++) if(sum[i] != b[i].r-b[i].l+)
  72. for(int j=b[i].l; j<=b[i].r; j++) if(!cou[j]) return j;
  73. return -;
  74. }
  75. }B;
  76. inline void cha(int u,int d){
  77. if(vis[u]) B.del(a[u]), B.add(d);
  78. a[u]=d;
  79. }
  80. inline void Xor(int u){
  81. if(vis[u]) B.del(a[u]), vis[u]=;
  82. else B.add(a[u]), vis[u]=;
  83. }
  84. inline void move(int x,int y){
  85. if(deep[x]<deep[y]) swap(x, y);
  86. while(deep[x]>deep[y]) Xor(x), x=fa[x][];
  87. while(x!=y) Xor(x), Xor(y), x=fa[x][], y=fa[y][];
  88. }
  89.  
  90. void modui(){
  91. u=v=;
  92. for(int i=;i<=p;i++){
  93. while(cur<q[i].tim) cur++, cha(cq[cur].u, cq[cur].next);
  94. while(cur>q[i].tim) cha(cq[cur].u, cq[cur].last), cur--;
  95. if(u!=q[i].u) move(u, q[i].u), u=q[i].u;
  96. if(v!=q[i].v) move(v, q[i].v), v=q[i].v;
  97. int anc=lca(u, v);
  98. Xor(anc); ans[q[i].id]=B.mex()-; Xor(anc);
  99. }
  100. }
  101.  
  102. int main(){
  103. freopen("in","r",stdin);
  104. n=read(); Q=read();
  105. for(int i=;i<=n;i++) a[i]=t[i]=read()+;
  106. for(int i=;i<n ;i++) ins(read(), read() );
  107. block=pow(n, 0.45);
  108. dfs();
  109. while(top) pos[st[top--]]=m;
  110. for(int i=;i<=Q;i++){
  111. op=read(); x=read(); y=read();
  112. if(op) p++, q[p]=(meow){x, y, tim, p};
  113. else tim++, cq[tim]=(cmeow){x, y+, t[x]}, t[x]=y+;
  114. }
  115.  
  116. B.n = n+; B.ini();
  117. sort(q+, q++p);
  118. modui();
  119. for(int i=;i<=p;i++) printf("%d\n",ans[i]);
  120. }

BZOJ 4129: Haruna’s Breakfast [树上莫队 分块]的更多相关文章

  1. bzoj 4129 Haruna’s Breakfast 树上莫队

    按照dfs序分块,莫队乱搞 再套个权值分块 #include<cstdio> #include<iostream> #include<cstring> #inclu ...

  2. BZOJ 4129 Haruna’s Breakfast ( 树上带修莫队 )

    题面 求树上某路径上最小的没出现过的权值,有单点修改 添加链接描述 分析 树上带修莫队板题,问题是怎么求最小的没出现过的权值. 因为只有nnn个点,所以没出现过的最小值一定在[0,n][0,n][0, ...

  3. 【bzoj4129】Haruna’s Breakfast 带修改树上莫队+分块

    题目描述 给出一棵树,点有点权.支持两种操作:修改一个点的点权,查询链上mex. 输入 第一行包括两个整数n,m,代表树上的结点数(标号为1~n)和操作数.第二行包括n个整数a1...an,代表每个结 ...

  4. BZOJ 4129 Haruna’s Breakfast (分块 + 带修莫队)

    4129: Haruna’s Breakfast Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 835  Solved: 409[Submit][St ...

  5. BZOJ 4129 Haruna’s Breakfast

    传送门 同样是树上莫队 只不过要求一个集合的mex,这里可以使用分块,可以在根号时间内得出解 /************************************************** P ...

  6. BZOJ.3052.[WC2013]糖果公园(树上莫队 带修改莫队)

    题目链接 BZOJ 当然哪都能交(都比在BZOJ交好),比如UOJ #58 //67376kb 27280ms //树上莫队+带修改莫队 模板题 #include <cmath> #inc ...

  7. BZOJ.4241.历史研究(回滚莫队 分块)

    题目链接 \(Description\) 长度为n的数列,m次询问,每次询问一段区间最大的 \(A_i*tm_i\) (重要度*出现次数) \(Solution\) 好像可以用莫队做,但是取max的操 ...

  8. BZOJ 3052: [wc2013]糖果公园 | 树上莫队

    题目: UOJ也能评测 题解 请看代码 #include<cstdio> #include<algorithm> #include<cstring> #includ ...

  9. Bzoj 3781: 小B的询问 莫队,分块,暴力

    3781: 小B的询问 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 426  Solved: 284[Submit][Status][Discuss ...

随机推荐

  1. 通过案例理解position:relative和position:absolute

    w3school过了HTML的知识之后,觉得要自己单纯地去啃知识点有点枯燥,然后自己也很容易忘记,所以便找具体的网站练手便补上不懂的知识点.position:relative和postion:abso ...

  2. GO开发[四]:golang函数

    函数 1.声明语法:func 函数名 (参数列表) [(返回值列表)] {} 2.golang函数特点: a. 不支持重载,一个包不能有两个名字一样的函数 b. 函数是一等公民,函数也是一种类型,一个 ...

  3. Android studio启动后卡在refreshing gradle project(包解决)

    这个问题几乎每个刚使用Android studio的同学都会碰到过,网上有各式各样的方法,有的说使用本地gradle,我试过多次,每次启动android studio时还是会检查更新,所以根本上解决的 ...

  4. 三分钟使用webpack-dev-sever搭建一个服务器

    webpack-dev-server是一个小型的Node.js Express服务器,我们可以通过它搭建一个本地服务器,并且实现文件热更新; 1.切换到你的目录下对项目进行初始化 npm init 一 ...

  5. Spark算子--map和flatMap

    map和flatMap--Transformation类算子 代码示例 result  

  6. mysql 远程连接数据库的二种方法

    一.连接远程数据库: 1.显示密码 如:MySQL 连接远程数据库(192.168.5.116),端口"3306",用户名为"root",密码"123 ...

  7. 如何查看sublime安装了哪些插件

    你应该安装过package control. 那么只要这样:按ctrl+shift+p,输入package,选择list packages,就看到了. 或者直接查看Installed Packages ...

  8. [SinGuLaRiTy] NOIP互测模拟赛

    [SinGuLaRiTy-1045] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 源文件名 输入输出文件 时间限制 内存限制 淘气的cch ...

  9. Mac下用SSH连接远程Linux或Mac服务器

    1.打开Mac终端 2.切换到root登录 输入命令:sudo -i,然后输入本机密码 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px &qu ...

  10. uwsgi常用配置

    一.安装方式 1.wget 可以去官网:https://pypi.python.org/pypi/uWSGI/ 下载对应的版本   tar -xvf uwsgi-2.13.1.tar.gz cd uw ...