【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. asp.net core添加全局异常处理及log4net、Nlog应用

    0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 一.介绍 此篇文章将会介绍项目的全局异常收集以及采用log4net或者NLog记录. 众所周知,一旦自己的项目报错,如果没有进行处 ...

  2. Angular开发者手册重点翻译之指令(一)

    创建自定义的指令 这个文章将解释什么需要在自己的angularjs应用中创建自己的指令,以及如何实现它. 什么是指令 在高的层面上讲,指令是DOM元素中的标记(例如一个属性,一个节点名,注释或者CSS ...

  3. 十、Django之Admin

    一.Django Admin 管理工具 Django 提供了基于 web 的管理工具. Django 自动管理工具是 django.contrib 的一部分.你可以在项目的 settings.py 中 ...

  4. TensorFlow(实战深度学习框架)----深层神经网络(第四章)

    深层神经网络可以解决部分浅层神经网络解决不了的问题. 神经网络的优化目标-----损失函数 深度学习:一类通过多层非线性变化对高复杂性数据建模算法的合集.(两个重要的特性:多层和非线性) 线性模型的最 ...

  5. ubuntu/linux系统中安装jdk以及eclipse(附图解详细步骤)

    1.首先得先下载JDK和eclipsejdk下载网址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-21 ...

  6. Numpy入门笔记第二天

    # 数组的组合 import numpy as np arr1 = np.arange(5) arr2 = np.arange(3) print arr1 print arr2 [0 1 2 3 4] ...

  7. 多用户在线FTP程序

    项目名:多用户在线FTP程序 一.需求 1.用户加密认证 2.允许同时多用户登录 3.每个用户有自己的家目录 ,且只能访问自己的家目录 4.对用户进行磁盘配额,每个用户的可用空间不同 5.允许用户在f ...

  8. Segments CodeForces 909B (找规律)

    Description You are given an integer N. Consider all possible segments (线段,划分)on the coordinate axis ...

  9. struts2--上传总结(限制大小和类型 非法上传的跳转)

    网上有很多版本,鉴于实践出真知的态度 我自己探索了一番 struts版本:2.3.16 限制大小: struts2默认是2M 所以如果要扩大大小限制,应该先配一个全局struts2最大上限 <c ...

  10. 划分树---hdu4417---区间查找(不)大于h的个数

    http://acm.hdu.edu.cn/showproblem.php?pid=4417 Super Mario Time Limit: 2000/1000 MS (Java/Others)    ...