题目描述
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; } } }
|