atcoder C

题目链接:http://agc017.contest.atcoder.jp/tasks/agc017_c

题解:就是简单的模拟一下就行。看一下代码就能理解

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int M = 2e5 + 10;
int a[M] , vis[M] , cnt[M];
int main() {
    int n , m;
    scanf("%d%d" , &n , &m);
    int ans = n;
    for(int i = 1 ; i <= n ; i++) {
        scanf("%d" , &a[i]);
        cnt[a[i]]++;
        int pos = a[i] - cnt[a[i]];
        if(pos >= 0) {
            if(!vis[pos]) ans--;
            vis[pos]++;
        }
    }
    while(m--) {
        int x , y;
        scanf("%d%d" , &x , &y);
        int pos = a[x] - cnt[a[x]];
        if(pos >= 0) {
            vis[pos]--;
            if(!vis[pos]) ans++;
        }
        cnt[a[x]]--;
        a[x] = y;
        cnt[a[x]]++;
        pos = a[x] - cnt[a[x]];
        if(pos >= 0) {
            if(!vis[pos]) ans--;
            vis[pos]++;
        }
        printf("%d
" , ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/TnT2333333/p/7149942.html