洛谷P3939 数颜色(二分 vector)

题意

题目链接

Sol

直接拿vector维护每种颜色的出现位置,然后二分一下。

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 3e5 + 10;
inline int read() {
    char c = getchar(); int x = 0, f = 1;
    while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
    while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
    return x * f;
}
int N, M, a[MAXN];
vector<int> v[MAXN];
void Modify(int c, int l, int val) {
    vector<int> &T = v[c];
    int pos = lower_bound(T.begin(), T.end(), l) - T.begin();
    T[pos] += val;
}
int Query(int c, int pos) {
    vector<int> &T = v[c];
    int num = upper_bound(T.begin(), T.end(), pos) - T.begin();
    if(num == 0) return 0;
    else return num;
}
int main() {
    N = read(); M = read();
    for(int i = 1; i <= N; i++) v[a[i] = read()].push_back(i);
    for(int i = 1; i <= M; i++) {
        int opt = read();
        if(opt == 1) {
            int l = read(), r = read(), c = read();
            printf("%d\n", Query(c, r) - Query(c, l - 1));
        } else {
            int l = read(), r = l + 1;
            if(a[l] != a[r]) {
                Modify(a[l], l, 1); Modify(a[r], r, -1);
                swap(a[l], a[r]);
            }
        }
    }
    return 0;   
}
posted @ 2018-12-07 12:55  自为风月马前卒  阅读(415)  评论(0编辑  收藏  举报

Contact with me