BZOJ 4129: Haruna’s Breakfast [树上莫队 分块]
题意:
单点修改,求一条链的mex
分块维护权值,$O(1)$修改$O(S)$求mex......
带修改树上莫队
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=5e4+;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} int n,Q,a[N],t[N],op,x,y;
struct edge{int v,ne;} e[N<<];
int cnt,h[N];
inline void ins(int u,int v){
e[++cnt]=(edge){v,h[u]}; h[u]=cnt;
e[++cnt]=(edge){u,h[v]}; h[v]=cnt;
}
int block, pos[N], m, st[N], top;
int fa[N][], deep[N];
void dfs(int u){
for(int i=; (<<i)<=deep[u]; i++)
fa[u][i]=fa[ fa[u][i-] ][i-];
int bot=top;
for(int i=h[u];i;i=e[i].ne) if(e[i].v!=fa[u][]){
fa[e[i].v][]=u; deep[e[i].v]=deep[u]+;
dfs(e[i].v);
if(top-bot>=block){
m++;
while(top!=bot) pos[st[top--]]=m;
}
}
st[++top]=u;
}
inline int lca(int x,int y){
if(deep[x]<deep[y]) swap(x, y);
int bin=deep[x]-deep[y];
for(int i=;i<;i++) if((<<i)&bin) 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][];
} struct cmeow{int u, next, last;}cq[N];
struct meow{
int u, v, tim, id;
bool operator <(const meow &a) const {
return pos[u]==pos[a.u] ? (pos[v]==pos[a.v] ? tim<a.tim : pos[v]<pos[a.v]) : pos[u]<pos[a.u];
}
}q[N];
int p, tim, u, v, cur, ans[N], vis[N]; struct Block{
int n,pos[N],m,block;
struct _blo{int l,r;} b[];
void ini(){
block=sqrt(n); m=(n-)/block+;
for(int i=;i<=n;i++) pos[i]=(i-)/block+;
for(int i=;i<=m;i++) b[i].l=(i-)*block+, b[i].r=i*block;
b[m].r=n;
}
int cou[N], sum[];
inline void add(int v) { if(v<=n) sum[pos[v]]+= (++cou[v])==; }
inline void del(int v) { if(v<=n) sum[pos[v]]-= (--cou[v])==; }
inline 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(!cou[j]) return j;
return -;
}
}B;
inline void cha(int u,int d){
if(vis[u]) B.del(a[u]), B.add(d);
a[u]=d;
}
inline void Xor(int u){
if(vis[u]) B.del(a[u]), vis[u]=;
else B.add(a[u]), vis[u]=;
}
inline void move(int x,int y){
if(deep[x]<deep[y]) swap(x, y);
while(deep[x]>deep[y]) Xor(x), x=fa[x][];
while(x!=y) Xor(x), Xor(y), x=fa[x][], y=fa[y][];
} void modui(){
u=v=;
for(int i=;i<=p;i++){
while(cur<q[i].tim) cur++, cha(cq[cur].u, cq[cur].next);
while(cur>q[i].tim) cha(cq[cur].u, cq[cur].last), cur--;
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);
Xor(anc); ans[q[i].id]=B.mex()-; Xor(anc);
}
} int main(){
freopen("in","r",stdin);
n=read(); Q=read();
for(int i=;i<=n;i++) a[i]=t[i]=read()+;
for(int i=;i<n ;i++) ins(read(), read() );
block=pow(n, 0.45);
dfs();
while(top) pos[st[top--]]=m;
for(int i=;i<=Q;i++){
op=read(); x=read(); y=read();
if(op) p++, q[p]=(meow){x, y, tim, p};
else tim++, cq[tim]=(cmeow){x, y+, t[x]}, t[x]=y+;
} B.n = n+; B.ini();
sort(q+, q++p);
modui();
for(int i=;i<=p;i++) printf("%d\n",ans[i]);
}
BZOJ 4129: Haruna’s Breakfast [树上莫队 分块]的更多相关文章
- bzoj 4129 Haruna’s Breakfast 树上莫队
按照dfs序分块,莫队乱搞 再套个权值分块 #include<cstdio> #include<iostream> #include<cstring> #inclu ...
- BZOJ 4129 Haruna’s Breakfast ( 树上带修莫队 )
题面 求树上某路径上最小的没出现过的权值,有单点修改 添加链接描述 分析 树上带修莫队板题,问题是怎么求最小的没出现过的权值. 因为只有nnn个点,所以没出现过的最小值一定在[0,n][0,n][0, ...
- 【bzoj4129】Haruna’s Breakfast 带修改树上莫队+分块
题目描述 给出一棵树,点有点权.支持两种操作:修改一个点的点权,查询链上mex. 输入 第一行包括两个整数n,m,代表树上的结点数(标号为1~n)和操作数.第二行包括n个整数a1...an,代表每个结 ...
- BZOJ 4129 Haruna’s Breakfast (分块 + 带修莫队)
4129: Haruna’s Breakfast Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 835 Solved: 409[Submit][St ...
- BZOJ 4129 Haruna’s Breakfast
传送门 同样是树上莫队 只不过要求一个集合的mex,这里可以使用分块,可以在根号时间内得出解 /************************************************** P ...
- BZOJ.3052.[WC2013]糖果公园(树上莫队 带修改莫队)
题目链接 BZOJ 当然哪都能交(都比在BZOJ交好),比如UOJ #58 //67376kb 27280ms //树上莫队+带修改莫队 模板题 #include <cmath> #inc ...
- BZOJ.4241.历史研究(回滚莫队 分块)
题目链接 \(Description\) 长度为n的数列,m次询问,每次询问一段区间最大的 \(A_i*tm_i\) (重要度*出现次数) \(Solution\) 好像可以用莫队做,但是取max的操 ...
- BZOJ 3052: [wc2013]糖果公园 | 树上莫队
题目: UOJ也能评测 题解 请看代码 #include<cstdio> #include<algorithm> #include<cstring> #includ ...
- Bzoj 3781: 小B的询问 莫队,分块,暴力
3781: 小B的询问 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 426 Solved: 284[Submit][Status][Discuss ...
随机推荐
- C/C++之循环结构
C语言中提供四种循环,即goto循环.while循环.do…while循环和for循环.四种循环可以用来处理同一问题,一般情况下它们可以互相代替换,但一般不提倡用goto循环,因为强制改变程序的顺序经 ...
- SpringMVC框架学习笔记(2)——使用注解开发SpringMVC
1.配置web.xml <servlet> <servlet-name>mvc</servlet-name> <servlet-class>org.sp ...
- happymall 第十一章订单表 数据表设计
为订单号生成唯一索引,用用户id和订单号生成组合索引提高查询效率.
- Linux 用户组及用户管理
查看所有组的信息:(信息保存在/etc/group文件中) 其中每段信息用:分割 ,每段的含义如下: 用户名组名:密码:用户组的id:用户组所包含的用户(多个用户用,分割) 查看所有的用户信息:(信息 ...
- [学习OpenCV攻略][003[初试牛刀——显示图片]
cvLoadImage(路径) 加载指定路径的图片到内存 cvNamedWindow("窗口名称", 属性) 创建窗口,窗口名称用来被其他函数引用,属性:0表示窗口大小不变,CV_ ...
- .30-浅析webpack源码之doResolve事件流(1)
这里所有的插件都对应着一个小功能,画个图整理下目前流程: 上节是从ParsePlugin中出来,对'./input.js'入口文件的路径做了处理,返回如下: ParsePlugin.prototype ...
- Spark算子--map和flatMap
map和flatMap--Transformation类算子 代码示例 result
- java使用Websocket获取HttpSession出现的问题与解决
websocket的写法就不多说了,主要记一记其中出现的问题 1.获取不到httpSession 解决办法:先重写握手方法,将httpsession放入ServerEndpointConfig.get ...
- 配置国内PIP源方法
python开发者都知道,当我们pip install安装扩展库的时候,经常遇到安装失败(超时)等,有时候是因为国外镜像被屏蔽了,带来不少麻烦, 随着国内python开发的增多,越来越多企业都开放了自 ...
- Sublime 安装、插件CoolFormat
http://www.sublimetext.com/3 安装Package Control https://packagecontrol.io/installation#st3 安装插件Cool F ...