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