BZOJ3585,BZOJ2120,BZOJ3757三合一。

对于树上路径问题,树链剖分难以处理的时候,就用树上带修改莫队。

这里的MEX问题,使用BZOJ3585的分块方法,平衡了时间复杂度。

剩下的就是将分块、树上莫队、带修改莫队合在一起了。大概要实现一下几个函数:

插入某值、删除某值、查询MEX、加入一个修改操作、更改一个点产生的影响(可能加入可能删除)。

另外要注意两个经典易错处:修改操作要记录lst以方便撤销,lst初始就是读入的数值。左端点所在块编号比右端点大是交换左右端点。

 #include<cmath>
#include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
#define For(i,x) for (int i=h[x],k; i; i=nxt[i])
using namespace std; const int N=;
int n,m,op,u,v,A,B,p[N],bel[N],vis[N],val[N],w[N],lst[N],ans[N],fa[N][];
int cnt,top,bl,tot,s[][],stk[N],d[N],h[N],to[N<<],nxt[N<<];
struct P{ int op,x,y,t,lst,id; }a[N],b[N]; void add(int u,int v){ to[++cnt]=v; nxt[cnt]=h[u]; h[u]=cnt; } bool cmp(const P &a,const P &b){
if (bel[a.x]!=bel[b.x]) return bel[a.x]<bel[b.x];
if (bel[a.y]!=bel[b.y]) return bel[a.y]<bel[b.y];
return a.t<b.t;
} void dfs(int x){
d[x]=d[fa[x][]]+; int tmp=top;
rep(i,,) fa[x][i]=fa[fa[x][i-]][i-];
For(i,x) if ((k=to[i])!=fa[x][]){
fa[k][]=x; dfs(k);
if (top-tmp>=bl){ tot++; while (top>tmp) bel[stk[top--]]=tot; }
}
stk[++top]=x;
} int lca(int x,int y){
if (d[x]<d[y]) swap(x,y);
int t=d[x]-d[y];
for (int i=; ~i; i--) if (t&(<<i)) x=fa[x][i];
if (x==y) return x;
for (int i=; ~i; i--) if (fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i];
return fa[x][];
} void add(int x){
if (x>n) return;
int t=x%bl; s[p[x]][t]++; if (s[p[x]][t]==) w[p[x]]++;
} void del(int x){
if (x>n) return;
int t=x%bl; s[p[x]][t]--; if (s[p[x]][t]==) w[p[x]]--;
} int que(){
rep(i,,n/bl+){
if (w[i]==bl) continue;
rep(j,(i-)*bl,i*bl-) if (!s[i][j%bl]) return j;
}
return (n/bl+)*bl;
} void mdf(int x,int y){
if (!vis[x]){ val[x]=y; return; }
del(val[x]); val[x]=y; add(val[x]);
} void upd(int x){ vis[x]?del(val[x]):add(val[x]); vis[x]^=; } void work(int x,int y){
for (; x!=y; upd(x),x=fa[x][])
if (d[x]<d[y]) swap(x,y);
} void solve(){
int L=,R=,t=;
rep(i,,A){
while (t>a[i].t) mdf(b[t].x,b[t].lst),t--;
while (t<a[i].t) t++,mdf(b[t].x,b[t].y);
work(L,a[i].x); work(R,a[i].y); L=a[i].x; R=a[i].y;
int f=lca(L,R); upd(f); ans[a[i].id]=que(); upd(f);
}
} int main(){
freopen("bzoj4129.in","r",stdin);
freopen("bzoj4129.out","w",stdout);
scanf("%d%d",&n,&m); p[]=; bl=sqrt(n);
rep(i,,n) scanf("%d",&val[i]),lst[i]=val[i],p[i]=i/bl+;
rep(i,,n) scanf("%d%d",&u,&v),add(u,v),add(v,u);
dfs(); while (top) bel[stk[top--]]=tot;
rep(i,,m){
scanf("%d%d%d",&op,&u,&v);
if (op==){
a[++A]=(P){op,u,v,B,,A};
if (bel[u]>bel[v]) swap(a[A].x,a[A].y);
}else b[++B]=(P){op,u,v,B,lst[u],},lst[u]=v;
}
sort(a+,a+A+,cmp); solve();
rep(i,,A) printf("%d\n",ans[i]);
return ;
}

[BZOJ4129]Haruna’s Breakfast(树上带修改莫队)的更多相关文章

  1. bzoj4129 Haruna’s Breakfast 树上带修莫队+分块

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4129 题解 考虑没有修改的序列上的版本应该怎么做: 弱化的题目应该是这样的: 给定一个序列,每 ...

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

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

  3. [WC2013][luogu4074] 糖果公园 [树上带修改莫队]

    题面: 传送门 思路: 一道实现起来细节比较恶心的题目 但是其实就是一个裸的树上带修改莫队 好像树上莫队也出不了什么结合题目,不像序列莫队天天结合AC自动机.后缀数组...... 莫队学习请戳这里:莫 ...

  4. 【Luogu P4074】[WC2013]糖果公园(树上带修改莫队)

    题目描述 Candyland 有一座糖果公园,公园里不仅有美丽的风景.好玩的游乐项目,还有许多免费糖果的发放点,这引来了许多贪吃的小朋友来糖果公园游玩. 糖果公园的结构十分奇特,它由 \(n\) 个游 ...

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

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

  6. bzoj 3052: [wc2013]糖果公园【树上带修改莫队】

    参考:http://blog.csdn.net/lych_cys/article/details/50845832 把树变成dfs括号序的形式,注意这个是不包含lca的(除非lca是两点中的一个) 然 ...

  7. 【BZOJ】4129: Haruna’s Breakfast 树分块+带修改莫队算法

    [题意]给定n个节点的树,每个节点有一个数字ai,m次操作:修改一个节点的数字,或询问一条树链的数字集合的mex值.n,m<=5*10^4,0<=ai<=10^9. [算法]树分块+ ...

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

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

  9. 【BZOJ-3052】糖果公园 树上带修莫队算法

    3052: [wc2013]糖果公园 Time Limit: 200 Sec  Memory Limit: 512 MBSubmit: 883  Solved: 419[Submit][Status] ...

随机推荐

  1. Python微信红包算法

    sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...

  2. LAMP平台-wordpress的搭建

    LAMP平台-wordpress的搭建 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Linux+Apache+Mysql/MariaDB+Perl/PHP/Python一组常用来 ...

  3. js异步处理工作机制

    js异步处理工作机制   从基础的层面来讲,理解JavaScript的定时器是如何工作的是非常重要的.计时器的执行常常和我们的直观想象不同,那是因为JavaScript引擎是单线程的.我们先来认识一下 ...

  4. 洛谷 P1478 陶陶摘苹果(升级版)

    本萌新第一次发布题解,若有不严谨处请谅解. 我看了前面几位大佬的手笔,表示自己还是比较钟爱桶排序的.它非常简易直接,还省时间,尤其对于这类题目占用的的空间也很小. 我们看到题目下面的说明:xi< ...

  5. u_boot移植之内存基础知识DDR【转】

    转自:http://blog.chinaunix.net/uid-25909619-id-4938411.html

  6. react-router 4 路由的嵌套

    1.在component组件内部需要嵌套的位置直接嵌套Route标签 这个方法会使得路由标签比较分散,子组件我们必须直接将Route标签写入到父组件之中,而且路由必须包含根路径. // Dashboa ...

  7. Mac 命令行安装 dmg文件

    1.安装dmg文件 hdiutil attach jdk-9.0.1_osx-x64_bin.dmg 会挂载在 /Volumes 目录下 2.安装pkg文件(可以 man installer 查看命令 ...

  8. 查找网内活跃IP和自动传输文本

    ifconfig p32p1|egrep -o "broadcast [^ ]*" |grep -o "[0-9.]*"grep -o "broadc ...

  9. [转] caffe激活层及参数

    在激活层中,对输入数据进行激活操作(实际上就是一种函数变换),是逐元素进行运算的.从bottom得到一个blob数据输入,运算后,从top输入一个blob数据.在运算过程中,没有改变数据的大小,即输入 ...

  10. java字节流复制文件

    import java.io.FileInputStream; import java.io.FileOutputStream; import org.junit.Test; public class ...