大致题意:数组a包括n个元素,一共q次查询。
查询1:1 p v 更新a[p]=v(下标从1开始)。
查询2:输出要几次操作使数组a为全零。
查询2中的操作有要求:每次操作可以任选一个x,用数组中所有非零的元素减去这个x,减法操作之后数组不能有复数。
大概意思就是一个数组每次执行2查询时有多少种非零元素。
基本思路:p[]存数组,map存某个元素出现的次数,ans存当前有多少种不同的元素。更新后如果cnt==0了,则ans--,如果更新前cnt==0则ans++。
#include<cstdio>
#include<map>
using namespace std;
const int MAXN = 100005;
map<int, int> cnt;
int p[MAXN];
int t;
int main () {
// freopen("in.txt", "r", stdin);
register int t = 0, op, a, b, n, q, ans;
scanf("%d", &t);
while (t--) {
ans = 0;
cnt.clear();
scanf("%d%d", &n, &q);
for (int i = 1; i <= n; i++) {
scanf("%d", &p[i]);
cnt[p[i]]++;
}
ans = cnt.size();//最开始有多少种元素,此时包括0元素
for (int i = 0; i < q; i++) {
scanf("%d", &op);
if (op == 2) {
//0元素出现过且当前状态的数组里还有0
if (cnt.count(0) && cnt[0] != 0) printf("%d\n", ans - 1);
else printf("%d\n", ans);
}
else {
scanf("%d%d", &a, &b);
//出现新元素
if(cnt[b] == 0) {
cnt[b]++;
ans++;
}else
cnt[b]++;
//a位置的元素个数肯定要先减一
if(cnt[p[a]] != 0) {
cnt[p[a]]--;
//这种元素么得了
if(cnt[p[a]] == 0) {
ans--;
}
}
p[a] = b;
}
}
}
// fclose(stdin);
return 0;
}