题解:

树上+可修改莫队

莫队的每一块

可以用一个栈

每一次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. vue - nodejs

    一.知识 打开Nodejs英文网:https://nodejs.org/en/ 中文网:http://nodejs.cn/ 我们会发现这样一句话: 翻译成中文如下: Node.js 是一个基于 Chr ...

  2. How Instagram Feeds Work: Celery and RabbitMQ(转)

    原文:http://blogs.vmware.com/vfabric/2013/04/how-instagram-feeds-work-celery-and-rabbitmq.html Instagr ...

  3. 迅雷7 纯净版v7.9.18.4724

    http://soft2.xzstatic.com/2016/08/Thunder_7.9.13.4666_NoAD_VIP.exe http://www.downza.cn/soft/192064. ...

  4. Jquery EasyUI插件

    属性 属性是定义在 jQuery.fn.{plugin}.defaults.比如,dialog 的属性是定义在 jQuery.fn.dialog.defaults. 事件 事件(回调函数)也是定义在 ...

  5. vue学习之一vue初识

    一.vue.js是什么 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层 ...

  6. 如何用 testNG 生成测试报告

    原文地址https://testerhome.com/topics/3473 总结一下testNG生成报告的三种方式,基本都是我直接转载的,没有补充就不说了,有补充的我会加以说明的(这里直说生成报告, ...

  7. Android Media (Audio) Framework 多媒体系统框架

    http://blog.csdn.net/lskshz/article/details/17264113 原址:http://blog.csdn.net/myzhzygh/article/detail ...

  8. FFmpeg 入门(5):视频同步

    本文转自:FFmpeg 入门(5):视频同步 | www.samirchen.com 视频如何同步 在之前的教程中,我们已经可以开始播放视频了,也已经可以开始播放音频了,但是视频和音频的播放还未同步, ...

  9. 微信小程序:JS 交互逻辑

    微信小程序:JS 交互逻辑 一.JS 交互逻辑 一个服务仅仅只有界面展示是不够的,还需要和用户做交互:响应用户的点击.获取用户的位置等等.在小程序里边,我们就通过编写 JS 脚本文件来处理用户的操作. ...

  10. 20145307陈俊达《网络对抗》shellcode注入&return to libc

    20145307陈俊达<网络对抗>shellcode注入 Shellcode注入 基础知识 Shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并将 ...