atcoder C - Snuke and Spells(模拟+思维)

题目链接: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\n" , ans);
    }
    return 0;
}
posted @ 2017-07-11 12:22  Gealo  阅读(319)  评论(0编辑  收藏  举报