周六月赛P9583的一个疑惑
  • 板块学术版
  • 楼主封禁用户
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/8/27 20:19
  • 上次更新2023/11/3 00:50:19
查看原帖
周六月赛P9583的一个疑惑
553035
封禁用户楼主2023/8/27 20:19

考场上我想着对每个循环开一个桶,以行作为参考,寻找列中合并以后会被擦掉的,剩下的累加答案。
中间有一步是把列统计的值域装进一个桶里,结果出问题了,不知道为什么,有没有人能解释一下。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,m,q,k,a[QWQ],b[QWQ],s,c[QWQ*3]; ll res;
signed main(){
	n=read(),m=read(),q=read(),k=read();
	for (int i=1;i<=q;i++){
		int op=read(),x=read();
		if (op==1) a[x]++;
		if (op==2) b[x]++;
	} for (int i=1;i<=m;i++)
		c[b[i]%k]++;//这样就会WA
	for (int i=1;i<=n;i++)
		a[i]%=k;
	for (int i=1;i<=m;i++)
		s+=b[i]>0 ? 1:0;
	for (int i=1;i<=n;i++)
		if (!a[i]) res+=s-c[k];
		else res+=m-c[k-a[i]];
	printf("%lld",res);
	return 0;
} 

需要变成这样

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,m,q,k,a[QWQ],b[QWQ],s,c[QWQ*3]; ll res;
signed main(){
	n=read(),m=read(),q=read(),k=read();
	for (int i=1;i<=q;i++){
		int op=read(),x=read();
		if (op==1) a[x]++;
		if (op==2) b[x]++;
	} for (int i=1;i<=m;i++)
		b[i]%=k;
	for (int i=1;i<=n;i++)
		a[i]%=k;
	for (int i=1;i<=m;i++)
		c[b[i]]++;
	for (int i=1;i<=m;i++)
		s+=b[i]>0 ? 1:0;
	for (int i=1;i<=n;i++)
		if (!a[i]) res+=s-c[k];
		else res+=m-c[k-a[i]];
	printf("%lld",res);
	return 0;
} 
2023/8/27 20:19
加载中...