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. golang数据传输格式-序列化与反序列化

    golang数据传输格式-序列化与反序列化 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 想必计算机专业毕业的小伙伴应该都知道数据想要持久化存储,必须将其存在I/O设备里面,这些I ...

  2. 使用Python的turtle(海龟)模块画图

    第一步:让Python引入turtle模块,引入模块就是告诉Python你想要用它. import turtle 第二步:创建画布.调用turtle中的Pen函数 t = turtle.Pen() 第 ...

  3. 自定义泛型_无多态_通配符无泛型数组_jdk7泛型使用

    通配符 T, K, V, E 等泛型字母为有类型, 类型参数赋予具体的值 ? 未知类型 类型参数赋予不确定值, 任意类型 只能用在 声明类型上,方法参数上, 不能用在定义泛型类上 上限 extends ...

  4. Jenkins mac pkg安装 后默认配置文件/启动路径

    自启动文件路径 /Library/LaunchDaemons/org.jenkins-ci.plist jenkins.war 执行文件路径 /Applications/Jenkins/jenkins ...

  5. 日常训练赛 Problem C – Complete Naebbirac’s sequence

    比赛链接https://vjudge.net/contest/256988#status/17111202012/C/0/ 大意:三个操作,使得输入的数中,从1-n,每一个数出现的次数相同. wa代码 ...

  6. SqlMapConfig.xml全局配置文件介绍——(四)

    ----------mybatis的全局配置文件SqlMapConfig.xml,配置内容如下:----------- properties(属性) settings(全局配置参数) typeAlia ...

  7. springboot整合rabbitmq客户端连接报超时异常问题解决:An unexpected connection driver error occured java.net.SocketException: Socket Closed,java.util.concurrent.TimeoutException

    我用的是springboot2.0.6版本,对应的ampq也是2.0.6版本,然后启动一直报: 还有java.util.concurrent.TimeoutException, 用户授权什么的都对,很 ...

  8. 搭建RabbitMQ集群(通用)

    RabbitMQ在Erlang node(节点)上 Erlang天生具有集群特性,非常好搭建集群,每一个节点(node)上具有一个叫erlang.Cookie的东西,也是一个标识符,可以互认. 1). ...

  9. 002_更新Nginx证书

    全球可信并且唯一免费的HTTPS(SSL)证书颁发机构:StartSSL 1.自行颁发不受浏览器信任的SSL证书: HTTPS的SSL证书可以自行颁发,Linux下的颁发步骤如下: openssl g ...

  10. COM和.NET的互操作

    组件对象模型的基本知识         基于构件的软件开发日益流行,这里我吧自己在学校时整理的关于COM的一些东西献给大家,供初学者参考.一.组件(COM),是微软公司为了计算机工业的软件生产更加符合 ...