bzoj4129
题解:
树上+可修改莫队
莫队的每一块
可以用一个栈
每一次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的更多相关文章
- [BZOJ4129]Haruna’s Breakfast(树上带修改莫队)
BZOJ3585,BZOJ2120,BZOJ3757三合一. 对于树上路径问题,树链剖分难以处理的时候,就用树上带修改莫队. 这里的MEX问题,使用BZOJ3585的分块方法,平衡了时间复杂度. 剩下 ...
- 【BZOJ4129】Haruna’s Breakfast(树上莫队)
[BZOJ4129]Haruna's Breakfast(树上莫队) 题面 BZOJ Description Haruna每天都会给提督做早餐! 这天她发现早饭的食材被调皮的 Shimakaze放到了 ...
- 【树上莫队】【带修莫队】【权值分块】bzoj4129 Haruna’s Breakfast
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using ...
- BZOJ4129: Haruna’s Breakfast
Description Haruna每天都会给提督做早餐! 这天她发现早饭的食材被调皮的 Shimakaze放到了一棵 树上,每个结点都有一样食材,Shimakaze要考验一下她. 每个食材都有一个美 ...
- bzoj4129 Haruna’s Breakfast 莫队
这个思想不难理解了前面几个就能懂 但是代码比较复杂,大概会和之前几次碰到难题的时候一样,一步步思考下去,然后把难点分成好几个板块讲下qwq 首先读入这颗树,预处理下lca,然后就分块,这个时候就会碰到 ...
- 【bzoj4129】Haruna’s Breakfast 带修改树上莫队+分块
题目描述 给出一棵树,点有点权.支持两种操作:修改一个点的点权,查询链上mex. 输入 第一行包括两个整数n,m,代表树上的结点数(标号为1~n)和操作数.第二行包括n个整数a1...an,代表每个结 ...
- bzoj4129 Haruna’s Breakfast 树上带修莫队+分块
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4129 题解 考虑没有修改的序列上的版本应该怎么做: 弱化的题目应该是这样的: 给定一个序列,每 ...
- Noip前的大抱佛脚----赛前任务
赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...
随机推荐
- centos linux系统日常管理复习 CPU物理数逻辑核数,iftop ,iotop ,sar ,ps,netstat ,一网卡多IP,mii-tool 连接,ethtool速率,一个网卡配置多个IP,mii-tool 连接,ethtool速率 ,crontab备份, 第十八节课
centos linux系统日常管理复习 物理CPU和每颗CPU的逻辑核数,uptime ,w,vmstat,iftop ,iotop ,sar ,ps,netstat ,一个网卡配置多个IP,mii ...
- Myeclipse文档注释如何提炼(导出)成自己的API帮助文档?
第一步: 源码注释规范,一定要用/** 两个*这一特殊的注释.注释上可以添加@author等特殊说明,下图是部分 javadoc 标记 信息,可以根据需要选用. 第二步: 确保整个工程的项目都添加 ...
- JAVA优化技巧分享 让游戏更加的流畅
我的世界怎么样可以玩的更加流畅呢?怎么对游戏进行优化呢?相信很多小伙伴都很想知道吧,今天小编为大家带来的是我的世界游戏优化技巧,喜欢的小伙伴不要错 ... 在很多时候如果电脑配置过低的话,玩游戏并不流 ...
- python初识(二)
目录: 进制 基本数据类型 整形 布尔值 字符串 列表 元祖 字典 集合 range & enumerate 一.进制 二进制转换十进制计算: 十进制:==47 一个字节公式:==128 64 ...
- Saltstack数据系统
1.grainsgrains 是在 minion(客户端)启动时收集到的一些信息,比如操作系统类型.网卡ip等.强调是minion启动时收集到的数据,所以如果改了什么硬件啥的,要重启minion才能收 ...
- SEO笔记:构建URL的15个SEO最佳实践
By: Rand Fishkin 原文链接:https://moz.com/blog/15-seo-best-practices-for-structuring-urls #1: Whenever p ...
- tp基础补充
ThinkPHP php框架 真实项目开发步骤: 多人同时开发项目,协作开发项目.分工合理.效率有提高(代码风格不一样.分工不好) 测试阶段 上线运行 对项目进行维护.修改.升级(单个人维护项目,十分 ...
- 026-B树(一)
1.内节点:非根非叶子节点,即非根的分支节点. 2.名称:B-树=B树=平衡多路查找树. 3.定义:m阶B树. (0).根节点孩子数rootChildNum范围:若没有孩子节点则孩子数为0,若有孩子则 ...
- ng-深度学习-课程笔记-5: 深层神经网络(Week4)
1 深度L层神经网络( Deep L-layer Neural network ) 针对具体问题很难判断需要几层的网络,所以先试试逻辑回归是比较合理的做法,然后再试试单隐层,把隐层数量当作一个超参数, ...
- kali linux 安装过程
kali linux 安装过程 获取镜像文件 首先需要去官网获取kali linux的镜像文件,本来获取了kali的最新版,由于有些方面还没有得到完善,与VM还没有完全兼容,所以换了视频上的1.0.8 ...