CF940F Machine Learning 带修改莫队
题意:支持两种操作:$1.$ 查询 $[l,r]$ 每个数字出现次数的 $mex$,$2.$ 单点修改某一位置的值.
这里复习一下带修改莫队.
普通的莫队中,以左端点所在块编号为第一关键字,右端点大小为第二关键字,在带修改莫队中每一个操作都有一个时间戳,那时间戳就是第三关键字.
可以将数字先离散化,开一个桶来维护每一种数字出现的次数.
然后在移动区间时就将对应数字删除/插入.
再维护一个当前时刻,表示当前数组的状态是第 $now$ 个修改进行后的状态.
将 $now$ 一直移动到和当前询问的时间戳吻合即可.
注意:在移动时间戳的时候要换一下修改的值. 假如说原来的修改是变成 $y$,而序列中的元素为 $x$,就要将修改的元素变成 $y$.
这样在下一次经过这个时间戳的时候就会将之前改动过的值再改回来.
排序函数一定要注意:
struct query
{
int l,r,id,t;
query(int l=0,int r=0):l(l),r(r){}
bool operator<(query b) const
{
return l/B==b.l/B?(r/B==b.r/B?t<b.t:r<b.r):l<b.l;
}
}q[N];
这里千万不能写错,否则整个时间复杂度就假了~
一般来说,带修改莫队中块的大小取在 $n^{0.6666}$ 来说是比较优的.
这道题中,你发现 $mex$ 的大小不超过 $\sqrt n$,所以我们可以直接暴力求.
code:
#include <bits/stdc++.h>
#define N 300005
#define ll long long
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
int n,m,tot,opcnt,qcnt,B,now;
int a[N],A[N],output[N],cnt[N],mex[N];
struct query
{
int l,r,id,t;
query(int l=0,int r=0):l(l),r(r){}
bool operator<(query b) const
{
return l/B==b.l/B?(r/B==b.r/B?t<b.t:r<b.r):l<b.l;
}
}q[N];
struct change
{
int p,x;
change(int p=0,int x=0):p(p),x(x){}
}c[N];
void add(int num)
{
--mex[cnt[num]];
++mex[++cnt[num]];
}
void del(int num)
{
--mex[cnt[num]];
++mex[--cnt[num]];
}
void update(int id,int t)
{
if(c[t].p>=q[id].l&&c[t].p<=q[id].r)
{
del(a[c[t].p]);
add(c[t].x);
}
swap(c[t].x, a[c[t].p]);
}
int getans()
{
int i,j;
for(i=1;mex[i]>0;++i);
return i;
}
int main()
{
int i,j,l=2,r=1;
// setIO("input");
scanf("%d%d",&n,&m);
B=pow(n,0.6666);
for(i=1;i<=n;++i)
{
scanf("%d",&a[i]);
A[++tot]=a[i];
}
for(i=1;i<=m;++i)
{
int op,a,b;
scanf("%d%d%d",&op,&a,&b);
if(op==1)
{
++qcnt;
q[qcnt]=query(a,b);
q[qcnt].id=qcnt;
q[qcnt].t=opcnt;
}
else
{
++opcnt;
c[opcnt]=change(a,b);
A[++tot]=b;
}
}
sort(A+1,A+1+tot);
for(i=1;i<=n;++i) a[i]=lower_bound(A+1,A+1+tot,a[i])-A;
for(i=1;i<=opcnt;++i) c[i].x=lower_bound(A+1,A+1+tot,c[i].x)-A;
sort(q+1,q+1+qcnt);
for(i=1;i<=qcnt;++i)
{
for(;l>q[i].l;) add(a[--l]);
for(;r<q[i].r;) add(a[++r]);
for(;l<q[i].l;) del(a[l++]);
for(;r>q[i].r;) del(a[r--]);
for(;now<q[i].t;) update(i, ++now);
for(;now>q[i].t;) update(i, now--);
output[q[i].id]=getans();
}
for(i=1;i<=qcnt;++i) printf("%d\n",output[i]);
return 0;
}
CF940F Machine Learning 带修改莫队的更多相关文章
- Codeforces 940F Machine Learning 带修改莫队
题目链接 题意 给定一个长度为\(n\)的数组\(a\),\(q\)个操作,操作分两种: 对于区间\([l,r]\),询问\(Mex\{c_0,c_1,c_2,⋯,c_{10^9}\}\),其中\(c ...
- BZOJ2120 数颜色(带修改莫队)
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- bzoj 2120 数颜色 带修改莫队
带修改莫队,每次查询前调整修改 #include<cstdio> #include<iostream> #include<cstring> #include< ...
- BZOJ2120&2453数颜色——线段树套平衡树(treap)+set/带修改莫队
题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2 ...
- BZOJ.2453.维护队列([模板]带修改莫队)
题目链接 带修改莫队: 普通莫队的扩展,依旧从[l,r,t]怎么转移到[l+1,r,t],[l,r+1,t],[l,r,t+1]去考虑 对于当前所在的区间维护一个vis[l~r]=1,在修改值时根据是 ...
- [BZOJ4129]Haruna’s Breakfast(树上带修改莫队)
BZOJ3585,BZOJ2120,BZOJ3757三合一. 对于树上路径问题,树链剖分难以处理的时候,就用树上带修改莫队. 这里的MEX问题,使用BZOJ3585的分块方法,平衡了时间复杂度. 剩下 ...
- BZOJ.3052.[WC2013]糖果公园(树上莫队 带修改莫队)
题目链接 BZOJ 当然哪都能交(都比在BZOJ交好),比如UOJ #58 //67376kb 27280ms //树上莫队+带修改莫队 模板题 #include <cmath> #inc ...
- BZOJ2120数颜色(带修改莫队)
莫队算法是一种数据结构的根号复杂度替代品,主要应用在询问[l,r]到询问[l+1,r]和[l,r+1]这两个插入和删除操作复杂度都较低的情况下.具体思想是:如果把一个询问[l,r]看做平面上的点(l, ...
- 【BZOJ】4129: Haruna’s Breakfast 树分块+带修改莫队算法
[题意]给定n个节点的树,每个节点有一个数字ai,m次操作:修改一个节点的数字,或询问一条树链的数字集合的mex值.n,m<=5*10^4,0<=ai<=10^9. [算法]树分块+ ...
随机推荐
- 1269: 划分数(Java)
WUSTOJ 1269: 划分数 参考博客 果7的博客 题目 将 1 个数 n 分成 m 份,求划分的种数.更多内容点击标题. 分析 唯一需要注意的地方是不考虑顺序.其他的直接看代码即可. 代 ...
- 位带操作—GPIO输出和输入
GPIOC->ODR |=(0<<2); // 总线操作,即操作整个寄存器. 在51单片机中 P0=0xFE; //总线操作. sbit LED1=P0^0; //位操作,即 ...
- SSH框架结合案例构建配置
ssh框架概述 SSH是 struts+spring+hibernate的一个集成框架,是目前比较流行的一种Web应用程序开源框架.区别于 Secure Shell . 集成SSH框架的系统从职责上分 ...
- 2019牛客多校一 H. XOR (线性基)
大意: 给定序列, 求所有异或和为$0$的子序列大小之和. 先求出线性基, 假设大小为$r$. 对于一个数$x$, 假设它不在线性基内, 那么贡献为$2^{n-r-1}$ 因为它与其余不在线性基内数的 ...
- 浅谈人脸识别中的loss 损失函数
浅谈人脸识别中的loss 损失函数 2019-04-17 17:57:33 liguiyuan112 阅读数 641更多 分类专栏: AI 人脸识别 版权声明:本文为博主原创文章,遵循CC 4.0 ...
- 【转】Visual Studio Code必备插件
先ctrl+shift+p,弹出命令面板-选中Extensions:Install Extensions 或者直接点击左侧栏这个扩展按钮(Ctrl+Shift+X) 然后左侧栏就会显示出很多插件,如图 ...
- CCF 201809-1 卖菜
题目: 问题描述 在一条街上有n个卖菜的商店,按1至n的顺序排成一排,这些商店都卖一种蔬菜. 第一天,每个商店都自己定了一个价格.店主们希望自己的菜价和其他商店的一致,第二天,每一家商店都会根据他自己 ...
- 设置pictureBox的边框颜色(转载)
原文地址:https://www.cnblogs.com/hardsoftware/p/5720545.html private void pictureBox2_Paint(object sende ...
- 3D数学基础_图形与游戏开发
https://blog.csdn.net/popy007/article/list/2?t=1& //向量计算相关文章 https://www.baidu.com/link?url=48C ...
- solr-jd
springMVC.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...