CF940F Machine Learning(带修莫队)
首先显然应该把数组离散化,然后发现是个带修莫队裸题,但是求mex比较讨厌,怎么办?其实可以这样求:记录每个数出现的次数,以及出现次数的出现次数。至于求mex,直接暴力扫最小的出现次数的出现次数为0的正整数,就一句话,这样看似会超时,实际上是O(√n)的复杂度。为什么?假设存在出现1,2,...,x的出现次数,则Σi(1<=i<=x)<=n,即x*(x+1)<=2*n,所以x至多是√n级别。很多人再把出现次数分块,根本没必要。然后考虑把数组分块的块大小,每次移动左指针,为O(n*块大小),移动右指针,为O(n*块大小+n*块个数),移动修改标记,为O(n*块个数2),然后显然块大小为O(n2/3)最优,复杂度O(n5/3)
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+;
struct query{int l,r,t,id;}q[N];
struct mdf{int pos,pre,now;}d[N];
int n,m,B,l=,r,cnt,qcnt,mcnt,a[N],b[N],c[N],tmp[N],tot[N],num[N],ans[N];
bool cmp(query a,query b)
{
if((a.l-)/B!=(b.l-)/B)return a.l<b.l;
return(a.r-)/B==(b.r-)/B?a.t<b.t:a.r<b.r;
}
void add(int x,int v){tot[num[x]]--,num[x]+=v,tot[num[x]]++;}
void modify(int i,int f)
{
if(d[i].pos>=l&&d[i].pos<=r)add(a[d[i].pos],-);
a[d[i].pos]=f==?d[i].now:d[i].pre;
if(d[i].pos>=l&&d[i].pos<=r)add(a[d[i].pos],);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%d",&a[i]),tmp[++cnt]=a[i];
for(int i=;i<=m;i++)
{
int op,x,y;scanf("%d%d%d",&op,&x,&y);
if(op==)q[++qcnt]=(query){x,y,mcnt,qcnt};
else d[++mcnt]=(mdf){x,,y},tmp[++cnt]=y;
}
sort(tmp+,tmp+cnt+);
cnt=unique(tmp+,tmp+cnt+)-tmp-;
for(int i=;i<=n;i++)a[i]=b[i]=lower_bound(tmp+,tmp+cnt+,a[i])-tmp;
for(int i=;i<=mcnt;i++)
{
d[i].now=lower_bound(tmp+,tmp+cnt+,d[i].now)-tmp;
d[i].pre=b[d[i].pos],b[d[i].pos]=d[i].now;
}
B=pow(n,0.67);
sort(q+,q+qcnt+,cmp);
for(int i=,tm=;i<=qcnt;i++)
{
while(tm<q[i].t)modify(++tm,);
while(tm>q[i].t)modify(tm--,-);
while(r<q[i].r)add(a[++r],);
while(l>q[i].l)add(a[--l],);
while(r>q[i].r)add(a[r--],-);
while(l<q[i].l)add(a[l++],-);
ans[q[i].id]=;
while(tot[ans[q[i].id]])ans[q[i].id]++;
}
for(int i=;i<=qcnt;i++)printf("%d\n",ans[i]);
}
CF940F Machine Learning(带修莫队)的更多相关文章
- CF940F Machine Learning 带修改莫队
题意:支持两种操作:$1.$ 查询 $[l,r]$ 每个数字出现次数的 $mex$,$2.$ 单点修改某一位置的值. 这里复习一下带修改莫队. 普通的莫队中,以左端点所在块编号为第一关键字,右端点大小 ...
- Codeforces 940F Machine Learning 带修改莫队
题目链接 题意 给定一个长度为\(n\)的数组\(a\),\(q\)个操作,操作分两种: 对于区间\([l,r]\),询问\(Mex\{c_0,c_1,c_2,⋯,c_{10^9}\}\),其中\(c ...
- 【BZOJ-3052】糖果公园 树上带修莫队算法
3052: [wc2013]糖果公园 Time Limit: 200 Sec Memory Limit: 512 MBSubmit: 883 Solved: 419[Submit][Status] ...
- 「洛谷1903」「BZOJ2120」「国家集训队」数颜色【带修莫队,树套树】
题目链接 [BZOJ传送门] [洛谷传送门] 题目大意 单点修改,区间查询有多少种数字. 解法1--树套树 可以直接暴力树套树,我比较懒,不想写. 稍微口胡一下,可以直接来一个树状数组套主席树,也就是 ...
- BZOJ2120 数颜色 莫队 带修莫队
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2120.html 题目传送门 - BZOJ2120 题意 给定一个长度为 $n$ 的序列 $a$ ,有 ...
- BZOJ3052/UOJ#58 [wc2013]糖果公园 莫队 带修莫队 树上莫队
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ3052.html 题目传送门 - BZOJ3052 题目传送门 - UOJ#58 题意 给定一棵树,有 ...
- UVA 12345 Dynamic len(带修莫队)
Dynamic len [题目链接]Dynamic len [题目类型]带修莫队 &题解: 莫队可以单点更改,只要再多加一维,代表查询次数,排序的时候3个关键字. 之后循环离线的时候,先暴力时 ...
- bzoj 2120 数颜色 (带修莫队)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2120 题意:两种操作:Q 询问区间 l - r 内颜色的种类 ,R 单点修改 思路 ...
- BZOJ 4129 Haruna’s Breakfast (分块 + 带修莫队)
4129: Haruna’s Breakfast Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 835 Solved: 409[Submit][St ...
随机推荐
- 关于Android 的内存泄露及分析(转)
一. Android的内存机制Android的程序由Java语言编写,所以Android的内存管理与Java的内存管理相似.程序员通过new为对象分配内存,所有对象在java堆内分配空间:然而对象的释 ...
- 1、MYSQL 数据库的安装与配置
安装 1.打开官网https://www.mysql.com,选择社区版本 2.如图点击下在安装(本人在下载过程中亲身感觉下载时间非常漫长,需要等待,不知道为啥会有限速,可以参考网上教程用迅雷进行 ...
- Day6 - D - Tree 园丁的烦恼 HYSBZ - 1935
很久很久以前,在遥远的大陆上有一个美丽的国家.统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各种奇花异草.有一天国王漫步在花园里,若有所思,他问一个园丁道: “最近我在思索一个问题, ...
- JS: 子项可以来回交换的两个下拉列表
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> ...
- NO5 grep-head-tail命令
·*****grep:#过滤需要的内容(linux三剑客). -v:排除内容.eg:grep -v oldboy test.txt ·head: #头,头部.读取文 ...
- Codeforces Round #611 (Div. 3)
原题面:https://codeforces.com/contest/1283 A.Minutes Before the New Year 题目大意:给定时间,问距离零点零分还有多久? 分析:注意一下 ...
- CAN分帧接收实现
该版本程序实现了上电后先发送MACID检测功能,如果网络上有应答.则一直进行死循环,直到用户更改了本机的ID地址 才可以跳出循环体. 本单片机设置为双滤波 ,使目标地址为0X1F 实现了建立连接命令 ...
- 通过fiddler修改通讯返回值
1 在fiddler里选中url,右键unlock for editing 2 在fiddler里点击url, 在右面的返回值的 TextView 项里修改数据 3 取消 unlock for e ...
- 001、在本地搭建SAP虚拟机环境,用于各种暴力操作
一.在某网盘下载一个SAP虚拟机,用于SAP学习和相关的测试.打开图中的服务器,点击运行,等灯都变成绿色 二.点击打开熟悉的SAP登录图标 三.很完美的运行起来了. 友情提示:SAP对电脑配置要求挺高 ...
- 081-PHP的do-while循环
<?php $i = 1; do { echo $i; $i = $i +1; } while ($i <= 8); ?>