The 2018 JUST Collegiate Programming Contest A题 Zero Array

大致题意:数组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;
}

猜你喜欢

转载自blog.csdn.net/JSLS_WFQ/article/details/89240220