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. Spark记录-Scala集合

    Scala列表 Scala列表与数组非常相似,列表的所有元素都具有相同的类型,但有两个重要的区别. 首先,列表是不可变的,列表的元素不能通过赋值来更改. 其次,列表表示一个链表,而数组是平的. 具有类 ...

  2. export DataTable To Excel(C)

          static DataTable GetTable() { DataTable table = new DataTable(); // New data table. table.Colu ...

  3. 第5月第13天 node cnpm安装 babel

    1. https://nodejs.org/en/download/ http://www.runoob.com/react/react-install.html 2. npm install --s ...

  4. mybatis输入输出映射——(五)

    0.#{}与${}区别 #{}实现的是向prepareStatement中的预处理语句中设置参数值,sql语句中#{}表示一个占位符即?. <!-- 根据id查询用户信息 --> < ...

  5. RabbitMQ消费端消息的获取方式(.Net Core)

    1[短链接]:BasicGet(String queue, Boolean autoAck) 通过request的方式独自去获取消息,断开式,一次次获取,如果返回null,则说明队列中没有消息. 隐患 ...

  6. springcloud常见问题处理

    无法在任何已知服务器上执行请求. 原因是注册中心未启动.在使用springcloud搭建微服务时,一定要先启动注册中心,再启动服务端和客户端.具体报错如下: com.netflix.discovery ...

  7. pandas删除dataframe列

    data2 = data.drop(data.columns[0,1,3,4,6,8,10], 1)

  8. 360加固保的dex脱壳方法

    完全测试了看雪论坛的方法,发现并没有脱壳,依然无法反编译 http://bbs.pediy.com/thread-213377.htm 使用上面方法的结果是会得到16个dex文件,只有一个是与程序相关 ...

  9. VMware下三种网络连接模式

    VMware下三种网络连接模式 Bridged(桥接模式) 在桥接模式下,VMware虚拟出来的操作系统就像是局域网中的一独立的主机,它可以访问该类网段内任何一台机器. 桥接网络环境下需要做到: 手动 ...

  10. PS 切图、抠图

    PS切图https://www.cnblogs.com/xiongmanli/p/6079172.html https://tech.youzan.com/cut-boy/?hmsr=toutiao. ...