Problem Statement
There are N balls in a row. Initially, the i-th ball from the left has the integer Ai written on it.
When Snuke cast a spell, the following happens:
- Let the current number of balls be k. All the balls with k written on them disappear at the same time.
Snuke's objective is to vanish all the balls by casting the spell some number of times. This may not be possible as it is. If that is the case, he would like to modify the integers on the minimum number of balls to make his objective achievable.
By the way, the integers on these balls sometimes change by themselves. There will be M such changes. In the j-th change, the integer on the Xj-th ball from the left will change into Yj.
After each change, find the minimum number of modifications of integers on the balls Snuke needs to make if he wishes to achieve his objective before the next change occurs. We will assume that he is quick enough in modifying integers. Here, note that he does not actually perform those necessary modifications and leaves them as they are.
Constraints
- 1≤N≤200000
- 1≤M≤200000
- 1≤Ai≤N
- 1≤Xj≤N
- 1≤Yj≤N
Subscore
- In the test set worth 500 points, N≤200 and M≤200.
Input
Input is given from Standard Input in the following format:
N M A1 A2 ... AN X1 Y1 X2 Y2 : XM YM
Output
Print M lines. The j-th line should contain the minimum necessary number of modifications of integers on the balls to make Snuke's objective achievable.
Sample Input 1
5 3 1 1 3 4 5 1 2 2 5 5 4
Sample Output 1
0 1 1
- After the first change, the integers on the balls become 2, 1, 3, 4, 5, from left to right. Here, all the balls can be vanished by casting the spell five times. Thus, no modification is necessary.
- After the second change, the integers on the balls become 2, 5, 3, 4, 5, from left to right. In this case, at least one modification must be made. One optimal solution is to modify the integer on the fifth ball from the left to 2, and cast the spell four times.
- After the third change, the integers on the balls become 2, 5, 3, 4, 4, from left to right. Also in this case, at least one modification must be made. One optimal solution is to modify the integer on the third ball from the left to 2, and cast the spell three times.
Sample Input 2
4 4 4 4 4 4 4 1 3 1 1 1 2 1
Sample Output 2
0 1 2 3
Sample Input 3
10 10 8 7 2 9 10 6 6 5 5 4 8 1 6 3 6 2 7 10 9 7 9 9 2 4 8 1 1 8 7 7
Sample Output 3
1 0 1 2 2 3 3 3 3 2
题意:一个人在玩卡片游戏,每张卡片上有一个数,每一轮删去写着当前卡片数目的卡片,问最少修改多少张使得最后所有卡片都被删完,带修改。
题解:
智商题
对于一种权值x,记cnt[x]表示x的出现次数,我们把[x - cnt[x], x]这条线段画出来,最后就是没被任何线段覆盖的长度
正确性还是很显然的...想到就好了
#include <bits/stdc++.h>
#define xx first
#define yy second
#define mp make_pair
#define pb push_back
#define mset(x, y) memset(x, y, sizeof x)
#define mcpy(x, y) memcpy(x, y, sizeof x)
using namespace std;
typedef long long LL;
typedef pair < int, int > pii;
inline int Read()
{
int x = 0, f = 1, c = getchar();
for (; !isdigit(c); c = getchar())
if (c == '-')
f = -1;
for (; isdigit(c); c = getchar())
x = x * 10 + c - '0';
return x * f;
}
const int MAXN = 200005;
int n, m, ret, a[MAXN], b[MAXN], c[MAXN];
int main()
{
#ifdef wxh010910
freopen("data.in", "r", stdin);
#endif
ret = n = Read(), m = Read();
for (int i = 1; i <= n; i ++)
{
a[i] = Read(), c[a[i]] ++;
if (a[i] - c[a[i]] >= 0 && ++ b[a[i] - c[a[i]]] == 1)
ret --;
}
while (m --)
{
int x = Read(), y = Read();
if (a[x] - c[a[x]] >= 0 && !-- b[a[x] - c[a[x]]])
ret ++;
c[a[x]] --;
a[x] = y;
c[a[x]] ++;
if (a[x] - c[a[x]] >= 0 && ++ b[a[x] - c[a[x]]] == 1)
ret --;
printf("%d\n", ret);
}
}