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

题面

BZOJ

Description

Haruna每天都会给提督做早餐! 这天她发现早饭的食材被调皮的 Shimakaze放到了一棵

树上,每个结点都有一样食材,Shimakaze要考验一下她。

每个食材都有一个美味度,Shimakaze会进行两种操作:

1、修改某个结点的食材的美味度。

2、对于某条链,询问这条链的美味度集合中,最小的未出现的自然数是多少。即mex值。

请你帮帮Haruna吧。

Input

第一行包括两个整数n,m,代表树上的结点数(标号为1~n)和操作数。

第二行包括n个整数a1...an,代表每个结点的食材初始的美味度。

接下来n-1行,每行包括两个整数u,v,代表树上的一条边。

接下来m 行,每行包括三个整数

0 u x 代表将结点u的食材的美味度修改为 x。

1 u v 代表询问以u,v 为端点的链的mex值。

Output

对于每次询问,输出该链的mex值。

Sample Input

10 10

1 0 1 0 2 4 4 0 1 0

1 2

2 3

2 4

2 5

1 6

6 7

2 8

3 9

9 10

0 7 14

1 6 6

0 4 9

1 2 2

1 1 8

1 8 3

0 10 9

1 3 5

0 10 0

0 7 7

Sample Output

0

1

2

2

3

HINT

1<=n<=5*10^4

1<=m<=5*10^4

0<=ai<=10^9

题解

求\(mex\)

如果放在序列上做很显然是裸的莫队+对数字分块

放在树上面就树上莫队啊。。。

大于\(n\)的值对答案没有任何影响,直接丢掉就行了

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define MAX 55555
inline int read()
{
RG int x=0,t=1;RG char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
int n,m,blk;
struct Line{int v,next;}e[MAX<<1];
int h[MAX],cnt=1;
inline void Add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;}
int dfn[MAX],G[MAX],tim,gr,f[16][MAX],S[MAX],top,dep[MAX];
int dfs(int u,int ff)
{
f[0][u]=ff;dfn[u]=++tim;dep[u]=dep[ff]+1;
for(int i=1;i<=15;++i)f[i][u]=f[i-1][f[i-1][u]];
int ret=0;
for(int i=h[u];i;i=e[i].next)
{
int v=e[i].v;if(v==ff)continue;
ret+=dfs(v,u);
if(ret>=blk){++gr;while(ret--)G[S[top--]]=gr;ret=0;}
}
S[++top]=u;
return ret+1;
}
struct modify{int x,a,b;}p[MAX];
struct Query{int id,u,v,lb,rb,lm;}q[MAX];
bool operator<(Query a,Query b)
{
if(a.lb!=b.lb)return a.lb<b.lb;
if(a.rb!=b.rb)return a.rb<b.rb;
return a.lm<b.lm;
}
int LCA(int u,int v)
{
if(dep[u]<dep[v])swap(u,v);
for(int i=15;~i;--i)if(dep[f[i][u]]>=dep[v])u=f[i][u];
if(u==v)return u;
for(int i=15;~i;--i)if(f[i][u]!=f[i][v])u=f[i][u],v=f[i][v];
return f[0][u];
}
int cnt1,cnt2,a[MAX],pre[MAX],nblk;
int sum[MAX],sblk[MAX];
bool vis[MAX];
void Change(int x)
{
if(a[x]>n)return;
if(vis[x])--sum[a[x]]?x:--sblk[(a[x])/nblk];
else sum[a[x]]++?x:++sblk[(a[x])/nblk];
vis[x]^=1;
}
void ModifyLink(int u,int v)
{
while(u!=v)
if(dep[u]<dep[v])Change(v),v=f[0][v];
else Change(u),u=f[0][u];
}
int Mex()
{
for(int i=0;;++i)
if(sblk[i]!=nblk)
for(int j=0;j<nblk;++j)
if(!sum[i*nblk+j])return i*nblk+j;
}
void ModifyVal(int x,int c)
{
if(!vis[x])a[x]=c;
else Change(x),a[x]=c,Change(x);
}
int Ans[MAX];
int main()
{
n=read();m=read();blk=pow(n,0.66);nblk=sqrt(n);
for(int i=1;i<=n;++i)a[i]=pre[i]=read();
for(int i=1,u,v;i<n;++i)u=read(),v=read(),Add(u,v),Add(v,u);
dfs(1,0);
for(int i=1;i<=m;++i)
{
int opt=read(),u=read(),v=read();
if(opt==0)p[++cnt2]=(modify){u,pre[u],v},pre[u]=v;
else
{
if(dfn[u]>dfn[v])swap(u,v);
++cnt1,q[cnt1]=(Query){cnt1,u,v,G[u],G[v],cnt2};
}
}
sort(&q[1],&q[cnt1+1]);
int lca=LCA(q[1].u,q[1].v),pos=0;
while(pos<q[1].lm)++pos,ModifyVal(p[pos].x,p[pos].b);
ModifyLink(q[1].u,q[1].v);Change(lca);Ans[q[1].id]=Mex();Change(lca);
for(int i=2;i<=cnt1;++i)
{
while(pos<q[i].lm)++pos,ModifyVal(p[pos].x,p[pos].b);
while(pos>q[i].lm)ModifyVal(p[pos].x,p[pos].a),pos--;
ModifyLink(q[i-1].u,q[i].u);ModifyLink(q[i-1].v,q[i].v);
lca=LCA(q[i].u,q[i].v);
Change(lca);Ans[q[i].id]=Mex();Change(lca);
}
for(int i=1;i<=cnt1;++i)printf("%d\n",Ans[i]);
return 0;
}

【BZOJ4129】Haruna’s Breakfast(树上莫队)的更多相关文章

  1. BZOJ 4129: Haruna’s Breakfast [树上莫队 分块]

    传送门 题意: 单点修改,求一条链的mex 分块维护权值,$O(1)$修改$O(S)$求mex...... 带修改树上莫队 #include <iostream> #include < ...

  2. bzoj 4129 Haruna’s Breakfast 树上莫队

    按照dfs序分块,莫队乱搞 再套个权值分块 #include<cstdio> #include<iostream> #include<cstring> #inclu ...

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

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

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

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

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

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

  6. 【BZOJ 3735】苹果树 树上莫队(树分块+离线莫队+鬼畜的压行)

    2016-05-09 UPD:学习了新的DFS序列分块,然后发现这个东西是战术核导弹?反正比下面的树分块不知道要快到哪里去了 #include<cmath> #include<cst ...

  7. 【BZOJ-3757】苹果树 块状树 + 树上莫队

    3757: 苹果树 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1305  Solved: 503[Submit][Status][Discuss] ...

  8. [BZOJ 3052] [wc2013] 糖果公园 【树上莫队】

    题目链接:BZOJ - 3052 题目分析 这道题就是非常经典的树上莫队了,并且是带修改的莫队. 带修改的莫队:将询问按照 左端点所在的块编号为第一关键字,右端点所在的块为第二关键字,位于第几次修改之 ...

  9. 树上莫队 wowow

    构建:像线性的莫队那样,依旧是按sqrt(n)为一块分块. int dfs(int x){ ; dfn[x]=++ind; ;i<=;i++) if (bin[i]<=deep[x]) f ...

随机推荐

  1. Appium 安卓计算器demo

    package testProject; import org.openqa.selenium.*; import org.openqa.selenium.remote.DesiredCapabili ...

  2. AtCoder Regular Contest 101 D - Median of Medians

    二分答案 然后前缀和+树状数组来判断这个答案是否大于等于数 如果我们对于一个查询,如果小于这个数令为1,大于这个数领为-1 将所有前缀和放在树状数组中,就可以查询所有sum_{l} < sum_ ...

  3. 小白初识 - 归并排序(MergeSort)

    归并排序是一种典型的用分治的思想解决问题的排序方式. 它的原理就是:将一个数组从中间分成两半,对分开的两半再分成两半,直到最终分到最小的单位(即单个元素)的时候, 将已经分开的数据两两合并,并且在合并 ...

  4. 1.5 JAVA的高并发编程

    一.多线程的基本知识 1.1进程与线程的介绍(上个博客1.4中已经详细介绍进程和线程) 程序运行时在内存中分配自己独立的运行空间,就是进程 线程:它是位于进程中,负责当前进程中的某个具备独立运行资格的 ...

  5. Switch Game :因子数

    A - Switch Game Problem Description There are many lamps in a line. All of them are off at first. A ...

  6. /proc/sys目录下各文件参数说明

    linux 其他知识目录 原文链接:https://blog.csdn.net/hshl1214/article/details/4596583 一.前言本文档针对OOP8生产环境,具体优化策略需要根 ...

  7. ES6的新特性(15)——Promise 对象

    Promise 对象 Promise 的含义 Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大.它由社区最早提出和实现,ES6 将其写进了语言标准,统一了 ...

  8. winform界面之固定大小随dpi

    场景: 已经更改成大小可随dpi改变,可是在用applyresoures()之后(添加更改语言功能),发现控件大小失真. 分析:applyresoures()是把该控件的属性改为程序设计的固定大小,不 ...

  9. 马士兵老师hadoop讲解总结博客地址记录(啊啊啊啊啊,自己没有保存写好的博客...)

    http://www.cnblogs.com/yucongblog/p/6650822.html

  10. 【转】utf-8与Unicode的转化

    作者:uuspider链接:https://www.zhihu.com/question/23374078/answer/65352538来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业 ...