Machine Learning CodeForces - 940F (带修改的莫队)
You come home and fell some unpleasant smell. Where is it coming from?
You are given an array a. You have to answer the following queries:
- You are given two integers l and r. Let ci be the number of occurrences of i inal: r, where al: r is the subarray of a from l-th element to r-th inclusive. Find the Mex of {c0, c1, ..., c109}
- You are given two integers p to x. Change ap to x.
The Mex of a multiset of numbers is the smallest non-negative integer not in the set.
Note that in this problem all elements of a are positive, which means that c0 = 0 and 0 is never the answer for the query of the second type.
Input
The first line of input contains two integers n and q (1 ≤ n, q ≤ 100 000) — the length of the array and the number of queries respectively.
The second line of input contains n integers — a1, a2, ..., an (1 ≤ ai ≤ 109).
Each of the next q lines describes a single query.
The first type of query is described by three integers ti = 1, li, ri, where 1 ≤ li ≤ ri ≤ n — the bounds of the subarray.
The second type of query is described by three integers ti = 2, pi, xi, where 1 ≤ pi ≤ n is the index of the element, which must be changed and 1 ≤ xi ≤ 109 is the new value.
Output
For each query of the first type output a single integer — the Mex of{c0, c1, ..., c109}.
Example
10 4
1 2 3 1 1 2 2 2 9 9
1 1 1
1 2 8
2 7 1
1 2 8
2
3
2
Note
The subarray of the first query consists of the single element — 1.
The subarray of the second query consists of four 2s, one 3 and two 1s.
The subarray of the fourth query consists of three 1s, three 2s and one 3.
注意离散化 ,更换点也要加入数组里面进行离散化
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 2e5 + ;
int n, m, tim, L, R, tot, sz, qsz;
int sum[maxn], cnt[maxn], ans[maxn], now[maxn];
int a[maxn], b[maxn];
struct node {
int l, r, id, t;
node() {}
node(int l, int r, int id, int t): l(l), r(r), id(id), t(t) {}
} qu[maxn];
struct node1 {
int pos, x, y;
node1() {}
node1(int pos, int x, int y): pos(pos), x(x), y(y) {}
} c[maxn];
int cmp(node a, node b) {
if (a.l / sz == b.l / sz) {
if (a.r / sz == b.r / sz) return a.t < b.t;
return a.r < b.r;
}
return a.l < b.l;
}
void add(int val) {
cnt[sum[val]]--;
sum[val]++;
cnt[sum[val]]++;
}
void del(int val) {
cnt[sum[val]]--;
sum[val]--;
cnt[sum[val]]++;
}
void change(int pos, int x) {
if (L <= pos && pos <= R) {
del(now[pos]);
add(x);
}
now[pos] = x;
}
int main() {
scanf("%d%d", &n, &m);
sz = (int)pow(n, 0.66666667);
for (int i = ; i <= n ; i++) {
scanf("%d", &a[i]);
b[++tot] = a[i];
now[i] = a[i];
}
qsz = tim = ;
for (int i = ; i <= m ; i++) {
int op;
scanf("%d", &op);
if (op == ) {
int l, r;
scanf("%d%d", &l, &r);
qu[++qsz] = node(l, r, qsz, tim);
} else {
int pos, x;
scanf("%d%d", &pos, &x);
b[++tot] = x;
c[++tim] = node1(pos, x, now[pos]);
now[pos] = x;
}
}
sort(qu + , qu + qsz + , cmp);
sort(b + , b + tot + );
tot = unique(b + , b + tot + ) - b;
for (int i = ; i <= n ; i++)
now[i] = lower_bound(b + , b + tot + , a[i]) - b;
for (int i = ; i <= tim ; i++) {
c[i].x = lower_bound(b + , b + tot + , c[i].x) - b;
c[i].y = lower_bound(b + , b + tot + , c[i].y) - b;
}
tim = ;
for (int i = ; i <= qsz ; i++) {
while(L > qu[i].l) add(now[--L]);
while(R < qu[i].r) add(now[++R]);
while(L < qu[i].l) del(now[L++]);
while(R > qu[i].r) del(now[R--]);
while(tim < qu[i].t) tim++, change(c[tim].pos, c[tim].x);
while(tim > qu[i].t) change(c[tim].pos, c[tim].y), tim--;
int mex = ;
while(cnt[mex] > ) mex++;
ans[qu[i].id] = mex;
}
for (int i = ; i <= qsz ; i++ )
printf("%d\n", ans[i]);
return ;
}
Machine Learning CodeForces - 940F (带修改的莫队)的更多相关文章
- codeforces 940F 带修改的莫队
F. Machine Learning time limit per test 4 seconds memory limit per test 512 megabytes input standard ...
- Machine Learning Codeforces - 940F(带修莫队) && 洛谷P4074 [WC2013]糖果公园
以下内容未验证,有错请指正... 设块大小为T,则块数为$\frac{n}{T}$ 将询问分为$(\frac{n}{T})^2$块(按照左端点所在块和右端点所在块分块),同块内按时间从小到大依次处理 ...
- BZOJ 2120: 数颜色 带修改的莫队算法 树状数组套主席树
https://www.lydsy.com/JudgeOnline/problem.php?id=2120 标题里是两种不同的解法. 带修改的莫队和普通莫队比多了个修改操作,影响不大,但是注意一下细节 ...
- 【BZOJ】2120: 数颜色 带修改的莫队算法
[题意]给定n个数字,m次操作,每次询问区间不同数字的个数,或修改某个位置的数字.n,m<=10^4,ai<=10^6. [算法]带修改的莫队算法 [题解]对于询问(x,y,t),其中t是 ...
- 【bzoj4129】Haruna’s Breakfast 带修改树上莫队+分块
题目描述 给出一棵树,点有点权.支持两种操作:修改一个点的点权,查询链上mex. 输入 第一行包括两个整数n,m,代表树上的结点数(标号为1~n)和操作数.第二行包括n个整数a1...an,代表每个结 ...
- 【bzoj3052】[wc2013]糖果公园 带修改树上莫队
题目描述 给出一棵n个点的树,每个点有一个点权,点权范围为1~m.支持两种操作:(1)修改一个点的点权 (2)对于一条路径,求$\sum\limits_{i=1}^m\sum\limits_{j=1} ...
- P1903 [国家集训队]数颜色 / 维护队列 带修改的莫队
\(\color{#0066ff}{ 题目描述 }\) 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支 ...
- UOJ 58 (树上带修改的莫队)
UOJ 58 糖果公园 Problem : 给一棵n个点的树,每个点上有一种颜色,对于一条路径上的点,若 i 颜色第 j 次出现对该路径权值的贡献为 w[i] * c[j], 每次询问一条路径的权值, ...
- UVA - 12345 带修改的莫队
题意显然:给出初始序列,单点修改,区间查询元素的种类. 由于时限过宽,暴力可过. 比较优秀的解法应该是莫队. 带修改的莫队题解可以看https://www.luogu.org/blog/user126 ...
随机推荐
- POJ - 3259
要判断是否有负的权值 #include<iostream> #include<stdio.h> #include<algorithm> #include<st ...
- Python入门(5)
导览: 函数 集合 迭代器与生成器 模块 一.函数 只要学过其他编程语言应该对函数不太陌生,函数在面向过程的编程语言中占据了极重要的地位,可以说没有函数,就没有面向过程编程,而在面向对象语言中,对象的 ...
- CVPR-2018 那些有趣的新想法
Taylor Guo @ Shanghai - 2018.10.18 缘起 还有什么比顶级会议更适合寻找有趣新想法的地方吗?我们从CVPR 2018 计算机视觉和模式识别的顶级会议中发现了很多有趣的东 ...
- leetcode个人题解——#18 4sums
在3sums的基础上加了一层循环. class Solution { public: vector<vector<int>> fourSum(vector<int> ...
- Linux中常用的关机和重新启动命令
hutdown.halt.reboot以及init,它们都可以达到关机和重新启动的目的,但是每个命令的内部工作过程是不同的,下面将逐一进行介绍. 一.shutdown shutdown命令用于安全关闭 ...
- Tarball——以源代码的方式安装软件
一.Tarball文件 形成:将软件的所有源码文件先以tar打包,然后再以压缩技术(如gzip)来压缩.因为源码文件很大. 描述:一个软件包,解压缩后得到源代码文件.检测程序文件.软件的简易说明与安装 ...
- Android - 按钮组件详解
总结了Android中常用的按钮用法 示例源码下载地址 : -- CSDN : http://download.csdn.net/detail/han1202012/6852091 -- GitHu ...
- 字符串数组去重 ["a","b","c","a","b","c"] --> ["a","b","c"]
非正则实现: let str_arr=["a","b","c","a","b","c&qu ...
- thinkPHP框架单一入口文件解析
一.index.php (可参考ThinkPHP学习手册http://document.thinkphp.cn/manual_3_2.html#entrance_file) index.php单入口 ...
- Oracle查询字段中有空格的数据
一.问题说明 最近在给某个用户下的表批量添加注释时,在程序中将注释名用trim()过滤一遍就可以了,但是在程序执行成功后怎么检测添加的注释名是否有空格存在呢? 二.解决方法 1.SELECT * FR ...