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 ...
随机推荐
- 通过案例理解position:relative和position:absolute
w3school过了HTML的知识之后,觉得要自己单纯地去啃知识点有点枯燥,然后自己也很容易忘记,所以便找具体的网站练手便补上不懂的知识点.position:relative和postion:abso ...
- GO开发[四]:golang函数
函数 1.声明语法:func 函数名 (参数列表) [(返回值列表)] {} 2.golang函数特点: a. 不支持重载,一个包不能有两个名字一样的函数 b. 函数是一等公民,函数也是一种类型,一个 ...
- Android studio启动后卡在refreshing gradle project(包解决)
这个问题几乎每个刚使用Android studio的同学都会碰到过,网上有各式各样的方法,有的说使用本地gradle,我试过多次,每次启动android studio时还是会检查更新,所以根本上解决的 ...
- 三分钟使用webpack-dev-sever搭建一个服务器
webpack-dev-server是一个小型的Node.js Express服务器,我们可以通过它搭建一个本地服务器,并且实现文件热更新; 1.切换到你的目录下对项目进行初始化 npm init 一 ...
- Spark算子--map和flatMap
map和flatMap--Transformation类算子 代码示例 result
- mysql 远程连接数据库的二种方法
一.连接远程数据库: 1.显示密码 如:MySQL 连接远程数据库(192.168.5.116),端口"3306",用户名为"root",密码"123 ...
- 如何查看sublime安装了哪些插件
你应该安装过package control. 那么只要这样:按ctrl+shift+p,输入package,选择list packages,就看到了. 或者直接查看Installed Packages ...
- [SinGuLaRiTy] NOIP互测模拟赛
[SinGuLaRiTy-1045] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 源文件名 输入输出文件 时间限制 内存限制 淘气的cch ...
- Mac下用SSH连接远程Linux或Mac服务器
1.打开Mac终端 2.切换到root登录 输入命令:sudo -i,然后输入本机密码 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px &qu ...
- uwsgi常用配置
一.安装方式 1.wget 可以去官网:https://pypi.python.org/pypi/uWSGI/ 下载对应的版本 tar -xvf uwsgi-2.13.1.tar.gz cd uw ...