Codeforces 940F Machine Learning 带修改莫队
题目链接
题意
给定一个长度为\(n\)的数组\(a\),\(q\)个操作,操作分两种:
- 对于区间\([l,r]\),询问\(Mex\{c_0,c_1,c_2,⋯,c_{10^9}\}\),其中\(c_i\)表示\(i\)在\([l,r]\)中的出现次数;
- 将\(a_p\)修改为\(x\).
思路
参考:http://www.cnblogs.com/PinkRabbit/p/8476664.html
\(cnt\)数组记录\(a\)数组中数字的出现次数,\(num\)数组记录\(cnt\)数组中数字的出现次数,因此\(num\)数组中第一个对应值为\(0\)的下标即为\(Mex\).
注:同样的想法也可以用于维护众数的出现次数,\(num\)数组中最大的对应值不为\(0\)的下标即为众数的出现次数。
那么答案如何统计呢?
若答案为\(k\)则数字总数至少为\(1+2+\cdots+k-1=\frac{k*(k-1)}{2}\),所以每次从头开始统计答案是\(O(\sqrt n)\)的复杂度;
另外一个注意点就是\(num[0]\)的大小,也即初始为\(0\)的数字的个数,要开到离散化后的数字总数+1那么大,这是因为\(num[0]\)始终应该有值,因为要对\([0,10^9]\)的所有数统计(感谢粉兔)
Code
#include <bits/stdc++.h>
#define F(i, a, b) for (int i = (a); i < (b); ++i)
#define F2(i, a, b) for (int i = (a); i <= (b); ++i)
#define dF(i, a, b) for (int i = (a); i > (b); --i)
#define dF2(i, a, b) for (int i = (a); i >= (b); --i)
#define maxn 100010
using namespace std;
typedef long long LL;
int n,m,blo,temp,nn,a[maxn],t[maxn], bl[maxn], cnt[maxn<<1], num[maxn<<1], l, r, mp[maxn<<1], tot, ans[maxn],
cnt1, cnt2, tim;
struct qnode {
int l,r,tim,id;
bool operator < (const qnode& nd) const {
return bl[l]==bl[nd.l] ? (bl[r]==bl[nd.r] ? tim<nd.tim : bl[r]<bl[nd.r]) : bl[l]<bl[nd.l];
}
}q[maxn];
struct cnode { int x, yt, ys; }c[maxn];
inline void add(int x) { --num[cnt[x]]; ++num[++cnt[x]]; }
inline void del(int x) { --num[cnt[x]]; ++num[--cnt[x]]; }
inline void cha(int x, int y) {
if (l<=x&&x<=r) del(a[x]), add(y);
a[x] = y;
}
void discrete() {
sort(mp, mp+tot);
nn=unique(mp, mp+tot)-mp;
F2(i, 1, n) a[i]=lower_bound(mp,mp+nn,a[i])-mp+1;
F2(i, 1, cnt2) c[i].ys=lower_bound(mp,mp+nn,c[i].ys)-mp+1, c[i].yt=lower_bound(mp,mp+nn,c[i].yt)-mp+1;
}
int main() {
scanf("%d%d", &n, &m); blo = pow(n, 2.0/3.0);
F2(i, 1, n) scanf("%d", &a[i]), t[i] = mp[tot++] = a[i], bl[i]=(i-1)/blo;
F(i, 0, m) {
int op,l,r;
scanf("%d%d%d",&op,&l,&r);
if (op==1) q[cnt1] = {l, r, tim, cnt1}, ++cnt1;
else ++tim, c[++cnt2] = {l, r, t[l]}, t[l] = r, mp[tot++] = r;
}
discrete();
sort(q, q+cnt1);
r=0, l=1;
num[0]=nn+1; tim=0;
F(i, 0, cnt1) {
while (tim<q[i].tim) tim++, cha(c[tim].x, c[tim].yt);
while (tim>q[i].tim) cha(c[tim].x, c[tim].ys), --tim;
while (r<q[i].r) add(a[++r]);
while (l>q[i].l) add(a[--l]);
while (r>q[i].r) del(a[r--]);
while (l<q[i].l) del(a[l++]);
int temp=0;
while (num[temp]) ++temp;
ans[q[i].id] = temp;
}
F(i, 0, cnt1) printf("%d\n", ans[i]);
return 0;
}
Codeforces 940F Machine Learning 带修改莫队的更多相关文章
- CF940F Machine Learning 带修改莫队
题意:支持两种操作:$1.$ 查询 $[l,r]$ 每个数字出现次数的 $mex$,$2.$ 单点修改某一位置的值. 这里复习一下带修改莫队. 普通的莫队中,以左端点所在块编号为第一关键字,右端点大小 ...
- 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. [算法]树分块+ ...
随机推荐
- Jmeter学习(三)
Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试.(来自百度) jmeter的特点: 开源免费. ...
- PHP管理供下载的APK文件
当我们开发的APP多的时候,把所有的APK文件统一放到一个目录中管理,是一个不错的选择: 管理的方法有很多,这里说一种: 1..创建目录结构,先创建根目录download,在根目录中创建项目目录,在项 ...
- 梳理 Opengl ES 3.0 (五)shader运行原理
先来看看一张图 shader都是在运行时编译和执行的,每个shader都有一个main函数作为它的入口. vertex shader的功能有两个:一个是计算顶点坐标变换,另一个就是为片元shader计 ...
- jqprint导入jqgrid表格时,内容溢出的原因以及解决方法
jqprint在导入表格的时候,会将原表格的样式全部拉过来,所以说原表格(如jqgrid的表格)的内容在有滚动条的时候,必须得将宽度设置为100%(等百分比的宽度),不能设置成固定宽度,不然表格内容会 ...
- 软工实践Beta冲刺(2/7)
队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 1.界面的修改与完善 展示GitHub当日代码/文档签入记 ...
- iOS银联,支付宝,微信,ping++开发文档
银联支付 银联支付目测只需两个参数 1.tn 其实就是订单号 2.mode 是测试环境还是线上环境 开发步骤 1.首先客户端浏览商品,点击下单,请求到达商户后台 2.商户后台在提交订单信息到银联后台 ...
- Activiti工作流(一)——Activiti Diagram
工作流解决在多个参与者之间按照某种预定义的规则传递文档.信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现. 使用Eclipse开发,需要安排工作流插件,详情见下面. Name ...
- DDD-领域驱动设计
识别领域事件 DDD战术篇:领域模型的应用 DDD战略篇:架构设计的响应力 DDD实战篇:分层架构的代码结构
- text-overflow使用文字超多div的宽度或超过在table中<td>
关键字:text-overflow:ellipsis 语法:text-overflow:clip | ellipsis 取值 clip:默认值.不显示省略标记(...),而是简单的裁切. ellips ...
- SRM708 div1 PalindromicSubseq(动态规划+容斥原理)
题目大意:给定一个字符串,记X[i]为包含s[i]这个字符的所有子列是回文串的个数(注意是子列而不是子串),求出所有的X[i]*(i+1),然后异或起来作为返回结果 题解: 首先用容斥来想,如果当前枚 ...