一、该题的题意是:
有一个有n个元素的数组, 有q次操作。
操作1:将编号为p的数改为v
操作2: 询问最少次数的操作将该数组变成零数组(零数组:各个元素都为0 的数组;
该处的操作是指的是, 从数组中选个数,然后数组中每个数都减去该数(值为0 的数除外), 要避免存在 操作后存在负值)
#include <iostream>
#include<cstdio>
#include<map>
using namespace std;
map<int, int>Map;//映射 该map的 key值 表示 a数组中 存在的某个数 value 表示该数存在的个数
int a[111111];//该数组
int main()
{
long T;
cin>>T;
while(T--)
{
Map.clear();
long i, n, q;
scanf("%ld %ld", &n, &q);
long df = 0;//有多少个不同的数(注意 0 不算), 就要操作多少次才能变成零数组
for(i = 1;i <= n;i++)
{
int num;
scanf("%d", &num);
a[i] = num;
if(num&&Map[num] == 0)//注意 0 不算 0 不需要操作
{
df++;
}
Map[num]++;
}
while(q--)
{
int op;
scanf("%d", &op);
if(op == 1)
{
long p, v;
scanf("%ld %ld", &p, &v);
long num2 = a[p];
if(v&&Map[v] == 0)df++;//如果 要转换的 数v 不是 0 且 在map中对应 0个 df++
Map[v]++;
a[p] = v;
Map[num2]--;
if(num2&&Map[num2] == 0)//判断该数是否彻底消失在数组中 且该数不是 0 这样 不同的数就减少一个
{
df--;
}
}
else
{
printf("%ld\n", df);
}
}
}
return 0;
}