Luogu P3939 数颜色

题目传送门

数据结构学傻了……


对每个颜色开一个vector,记录该颜色出现过的位置
查询操作直接在vector里二分查找\(l,r\),一减就可以
修改操作直接二分后swap就可以了

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define LL long long
using namespace std;
LL read() {
    LL k = 0, f = 1; char c = getchar();
    while(c < '0' || c > '9') {
        if(c == '-') f = -1;
        c = getchar();
    }
    while(c >= '0' && c <= '9')
        k = k * 10 + c - 48, c = getchar();
    return k * f;
}
vector <int> col[300010];
int a[300010];
int main() {
    int n = read(), q = read();
    for(int i = 1; i <= n; ++i)
        a[i] = read(), col[a[i]].push_back(i);
    while(q--) {
        int opt = read();
        if(opt == 1) {
            int l = read(), r = read(), c = read();
            int x = lower_bound(col[c].begin(), col[c].end(), l) - col[c].begin() - 1;
            int y = upper_bound(col[c].begin(), col[c].end(), r) - col[c].begin() - 1;
            if(y-x < 0) printf("0\n");
            else printf("%d\n", y-x);
        }
        else {
            int pos = read();
            if(a[pos] == a[pos+1]) continue;
            int x = lower_bound(col[a[pos]].begin(), col[a[pos]].end(), pos) - col[a[pos]].begin();
            int y = lower_bound(col[a[pos+1]].begin(), col[a[pos+1]].end(), pos+1) - col[a[pos+1]].begin();
            swap(col[a[pos]][x], col[a[pos+1]][y]); swap(a[pos], a[pos+1]);
        }
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/morslin/p/11855771.html
今日推荐