蒟蒻又来发题解啦!
众所周知,这是一道普及/提高-的关于桶题目,所以整体来看不是很难。
首先要创建一个二维数组,每次经过暴力将数组内容修改。
值得注意的是,对于某个格子,设其所在行为i,所在列为j,如果(ri+cj)mod k=0,则说明行的操作和列的操作抵消了,这个格子不会被涂上颜色。
否则,这个格子就被涂上颜色了。我们开一个大小为k的桶w,统计一下r中每个元素的出现次数。我们从1到m枚举j,计算cj对答案的贡献。
最后输出所有元素的贡献之和即可。
废话不多说,上代码!
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+5,K=5e5+5;
int c[N],r[N],w[K];
int main(){
int n,m,q,K,op,x;
long long ans=0;
cin>>n>>m>>q>>K;
for(int i=1;i<=q;i++){
cin>>op>>x;
if(op==1){
r[x]++;
}else{
c[x]++;
}
}
for(int i=1;i<=n;i++){
w[r[i]%K]++;
}
for(int i=1;i<=m;i++){
c[i]%=K;
if(c[i]==0){
ans+=n-w[0];
}else{
ans+=n-w[K-c[i]];
}
}
cout<<ans;
return 0;
}