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. 如何使用ASP.NET开发基于推技术的聊天室?

    public class Content : System.Web.UI.Page{private void Page_Load(object sender, System.EventArgs e){ ...

  2. cas单点登录实现

    前言 此文为记录单点登录实现过程,包括cas服务端和客户端的定制扩展 服务端 单点登录服务端采用cas,以cas-server-webapp版本号为3.5.2.1为基础进行定制扩展实现. 定制实现的源 ...

  3. [BZOJ 1032][JSOI 2007]祖玛 题解(区间DP)

    [BZOJ 1032][JSOI 2007]祖玛 Description https://www.lydsy.com/JudgeOnline/problem.php?id=1032 Solution ...

  4. AC自动机(病毒侵袭 )

    题目链接:https://cn.vjudge.net/contest/280743#problem/B 题目大意:中文题目 具体思路:AC自动机模板题,编号的时候注意,是按照给定的id进行编号的.然后 ...

  5. 【CTF REVERSE】WHCTF2017-CRACKME

    1.前言 假装大学生水一下CTF题目,常规思路.程序没有加壳,是VC写的MFC程序. 2.破题思路 1.MessageBox 下断点 2.找到提示错误字符串的函数B 3.跟踪函数 4.跟踪算法 3.实 ...

  6. Python 优雅获取本机 IP 方法

    原文 见过很多获取服务器本地IP的代码,个人觉得都不是很好,例如以下这些 不推荐:靠猜测去获取本地IP方法 #!/usr/bin/env python # -*- coding: utf-8 -*- ...

  7. df -h执行卡住不动问题解决【转】

    昨天生产环境报日志写不进去了,因此 登陆线上环境后,习惯用df -h命令查看空间使用情况,结果发现该命令执行半天也没有返回. 因此使用mount命令查看该机器上的目录: [conversant@swi ...

  8. XShell 使用方法

    XShell是一款Windows下非常优秀的远程连接Linux主机的工具,是平常使用不可缺少的工具.复制和粘贴由于在linux的Shell下,Ctrl+c是中断当前指令,这个快捷键和win系统下的复制 ...

  9. javascript-序列化,时间,eval,转义

    一:序列化 JSON.stringify(li) 将对象转字符串 JSON.parse(str1) 将字符串转对象 li=[11,22,33] [11, 22, 33] li [11, 22, 33] ...

  10. 移动端调试工具---vConsole

    vConsole:https://github.com/Tencent/vConsole/blob/dev/README_CN.md 使用方法: 使用npm进行安装: npm install --sa ...