-二分- [洛谷 P3939]数颜色

题目描述

Link

Solution

先声明一下,以后的题解不再粘贴题面。

这道题我们可以用vector存下每种颜色所在的位置,然后再二分一下就可以了,甚至连离散化都不需要。

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define MAXN 300010
std::vector<int> v[MAXN];
int n, m, op, l, r, x, a[MAXN];
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
v[a[i]].push_back(i);
}
while (m--) {
scanf("%d", &op);
if (op == 1) {
scanf("%d%d%d", &l, &r, &x);
int pos = std::upper_bound(v[x].begin(), v[x].end(), r) - std::lower_bound(v[x].begin(), v[x].end(), l);
printf("%d\n", pos);
}
if (op == 2) {
scanf("%d", &x);
int ll = a[x], rr = a[x + 1];
std::swap(a[x], a[x + 1]);
if (a[x] == a[x + 1]) continue;
int pos = std::lower_bound(v[ll].begin(), v[ll].end(), x) - v[ll].begin();
int _pos = std::lower_bound(v[rr].begin(), v[rr].end(), x + 1) - v[rr].begin();
v[ll][pos] = x + 1;
v[rr][_pos] = x;
}
}
}
文章作者: RiverFun
文章链接: https://stevebraveman.github.io/blog/2019/03/06/68/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 RiverFun

评论