题解:

树上+可修改莫队

莫队的每一块

可以用一个栈

每一次dfs个数>sqrt(n)(自己选的)的时候就可以跳出了

然后不要忘记分出来最后一块

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=;
int k=,fi[N],unit,Be[N],m,st[N],top,fa[N][],deep[N],n,Q;
int a[N],t[N],op,x,y,p,tim,u=,v=,T,ans[N],vis[N],ne[N],zz[N];
struct Change
{
int u,New,Old;
}cq[N];
struct Query
{
int u,v,tim,id;
int operator <(const Query &a) const
{
if (Be[u]!=Be[a.u])return Be[u]<Be[a.u];
if (Be[v]!=Be[a.v])return Be[v]<Be[a.v];
return tim<a.tim;
}
}q[N];
struct Datalook
{
struct _bol{int l,r;}b[];
int n,Be[N],m,unit,num[N],sum[];
void init()
{
unit=sqrt(n);
m=(n-)/unit+;
for (int i=;i<=n;i++)Be[i]=(i-)/unit+;
for (int i=;i<=m;i++)b[i].l=(i-)*unit+,b[i].r=i*unit;
b[m].r=n;
}
void Add(int v)
{
if (v<=n)sum[Be[v]]+=(++num[v])==;
}
void Del(int v)
{
if (v<=n)sum[Be[v]]-=(--num[v])==;
}
int mex()
{
for (int i=;i<=m;i++)
if (sum[i]!=b[i].r-b[i].l+)
for (int j=b[i].l;j<=b[i].r;j++)
if (!num[j])return j;
return -;
}
}Data;
void jb(int u,int v)
{
ne[k]=fi[u];
zz[k]=v;
fi[u]=k++;
}
void dfs(int u)
{
for (int i=;i<=;i++)
if ((<<i)>deep[u])break;
else fa[u][i]=fa[fa[u][i-]][i-];
int bottom=top;
for (int i=fi[u];i;i=ne[i])
{
int v=zz[i];
if (v!=fa[u][])
{
fa[v][]=u;
deep[v]=deep[u]+;
dfs(v);
if (top-bottom>=unit)
{
m++;
while (top!=bottom)Be[st[top--]]=m;
}
}
}
st[++top]=u;
}
int Lca(int x,int y)
{
if (deep[x]<deep[y])swap(x,y);
int Dis=deep[x]-deep[y];
for (int i=;i<=;i++)
if ((<<i)&Dis)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 x==y?x:fa[x][];
}
void revise(int u,int d)
{
if (vis[u])
{
Data.Del(a[u]);
Data.Add(d);
}
a[u]=d;
}
void run(int u)
{
if (vis[u])
{
Data.Del(a[u]);
vis[u]=;
}
else
{
Data.Add(a[u]);
vis[u]=;
}
}
void move(int x,int y)
{
if (deep[x]<deep[y])swap(x,y);
while (deep[x]>deep[y])run(x),x=fa[x][];
while (x!=y)run(x),run(y),x=fa[x][],y=fa[y][];
}
int main()
{
scanf("%d%d",&n,&Q);
for (int i=;i<=n;i++)
{
scanf("%d",&a[i]);
t[i]=++a[i];
}
for (int i=;i<=n;i++)
{
scanf("%d%d",&x,&y);
jb(x,y);jb(y,x);
}
dfs();
while (top)Be[st[top--]]=m;
for (int i=;i<=Q;i++)
{
scanf("%d%d%d",&op,&x,&y);
if (op)q[++p]=(Query){x,y,tim,p};
if (!op)cq[++tim]=(Change){x,y+,t[x]},t[x]=y+;
}
Data.n=n+;
Data.init();
sort(q+,q++p);
for (int i=;i<=p;i++)
{
while (T<q[i].tim)T++,revise(cq[T].u,cq[T].New);
while (T>q[i].tim)revise(cq[T].u,cq[T].Old),T--;
if(u!=q[i].u)move(u,q[i].u),u=q[i].u;
if(v!=q[i].v)move(v,q[i].v),v=q[i].v;
int anc=Lca(u,v);
run(anc);
ans[q[i].id]=Data.mex()-;
run(anc);
}
for (int i=;i<=p;i++)printf("%d\n",ans[i]);
}

bzoj4129的更多相关文章

  1. [BZOJ4129]Haruna’s Breakfast(树上带修改莫队)

    BZOJ3585,BZOJ2120,BZOJ3757三合一. 对于树上路径问题,树链剖分难以处理的时候,就用树上带修改莫队. 这里的MEX问题,使用BZOJ3585的分块方法,平衡了时间复杂度. 剩下 ...

  2. 【BZOJ4129】Haruna’s Breakfast(树上莫队)

    [BZOJ4129]Haruna's Breakfast(树上莫队) 题面 BZOJ Description Haruna每天都会给提督做早餐! 这天她发现早饭的食材被调皮的 Shimakaze放到了 ...

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

    #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using ...

  4. BZOJ4129: Haruna’s Breakfast

    Description Haruna每天都会给提督做早餐! 这天她发现早饭的食材被调皮的 Shimakaze放到了一棵 树上,每个结点都有一样食材,Shimakaze要考验一下她. 每个食材都有一个美 ...

  5. bzoj4129 Haruna’s Breakfast 莫队

    这个思想不难理解了前面几个就能懂 但是代码比较复杂,大概会和之前几次碰到难题的时候一样,一步步思考下去,然后把难点分成好几个板块讲下qwq 首先读入这颗树,预处理下lca,然后就分块,这个时候就会碰到 ...

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

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

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

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

  8. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

随机推荐

  1. nginx + ngx_lua安装测试

    nginx lua模块淘宝开发的nginx第三方模块,它能将lua语言嵌入到nginx配置中,从而使用lua就极大增强了nginx的能力.nginx以高并发而知名,lua脚本轻便,两者的搭配堪称完美. ...

  2. Windows中杀死某个端口的进程

    最近写项目,总是出现端口被占用的问题,原来傻傻的把电脑重启一下,终于有一天受不了了,想要想办法解决.刚开始从网上找了好多教程,发现不行.开始自己尝试,终于,成功的将占用端口的进程杀掉.在此记录下过程( ...

  3. Executor框架与Thread

    Executor将线程的创建和线程的执行解耦,比较下面两个例子: 1:TaskExecutionWebServer.java package chapter06; import java.io.IOE ...

  4. Spring笔记一

    什么是Spring spring (由rod johnson创建的一个开源框架) spring是一个开源框架,spring是于2003 年兴起的一个轻量级的java 开发框架,由rod johnson ...

  5. html5 七巧板

    <!DOCTYPE html><html>    <canvas id="diag" height="200" width=&qu ...

  6. C++之路

    我学习C/C++也有两年了.开始是偏爱C语言和C++的语法特性强大,想用来做游戏开发.在深入学习的同时,逐渐了解到C++可以做很多事.大型项目需要用到运行效率高的C++,虽然运行效率越高,开发效率就要 ...

  7. 通过.properties配置文件,在Service层获取值

    问题:从配置文件获取不到值的原因:1.静态变量:2.没通过Spring加载该实例对象. 1. conf.properties配置文件内容: 2. Spring加载配置文件内容,spring-confi ...

  8. WdatePicker设置日期范围

    设置 结束日期不超过当天日期:设置 开始日期不超过结束日期:设置 开始日期默认显示当月1日的日期,结束日期显示当天日期?<label>开始日期:</label><inpu ...

  9. 远程连接软件TeamViewer

    (1)先在windows下安装Teamviewer软件,地址:https://pan.baidu.com/s/1rWxRBtNbn3OMmg-8YaYWRQ (2)再在linux下安装Teamview ...

  10. AI学习资料

    OpenAI Gym介绍 http://m.blog.csdn.net/u010510350/article/details/71450232