题解:

树上+可修改莫队

莫队的每一块

可以用一个栈

每一次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. 浅谈vuex

    很多技术,刚接触的时候:这是啥?用的时候:哟嚯,是挺好用的!加以研究:卧槽,就是这么个逼玩意儿! 最近接手了一个别人写了1/5的vue项目(页面画了1/3,接口啥都没对); 对于表格中的数据项操作以及 ...

  2. django-mvvm(django的FormObject)

    MVVM简介 MVVM模式是Model-View-ViewMode模式的简称.由视图(View).视图模型(ViewModel).模型(Model)三部分组成,结构如下图.通过这三部分实现UI逻辑.呈 ...

  3. HDU2426:Interesting Housing Problem(还没过,貌似入门题)

    #include <iostream> #include <queue> #include <stdio.h> #include <string.h> ...

  4. HDU1452:Happy 2004(求因子和+分解质因子+逆元)上一题的简单版

    题目链接:传送门 题目要求:求S(2004^x)%29. 题目解析:因子和函数为乘性函数,所以首先质因子分解s(2004^x)=s(2^2*x)*s(3^x)*s(167^x); 因为2与29,166 ...

  5. 转载Liferay PortletPreference store()方法研究

    我们对于PortletPreference 的store()用的非常广泛,很多情况下,我们一般对其进行一些设定,然后最后调用store()存储之,类似以下代码: PortletPreferences ...

  6. Mbps MB/S Mb/s

    以前都没有注意这几个的区别,今天百度科普了一下 所谓 10M 带宽,其实是指 10Mbps (兆比特) 1.平时所说的10m带宽,其实是指 10Mbps (兆比特)bit是计算机的最小位单位,1byt ...

  7. 【深入理解JVM】:类加载器与双亲委派模型

    类加载器 加载类的开放性 类加载器(ClassLoader)是Java语言的一项创新,也是Java流行的一个重要原因.在类加载的第一阶段“加载”过程中,需要通过一个类的全限定名来获取定义此类的二进制字 ...

  8. Conductor

    https://netflix.github.io/conductor/ High Level Architecture

  9. P1122 最大子树和(树形dp)

    P1122 最大子树和 大水题 随便找一个点做根,蓝后累计子树和. 子树和<0的话不取就行了 顺便找个最大值输出 end. #include<iostream> #include&l ...

  10. Qt无法调试Qvector

    现象: 解决: 打开文件 $(VSDIR)\Common7\Packages\Debugger\autoexp.dat (VSDIR是本机Visual Studio的安装目录)把定义QVector和Q ...