分析:
可以看成分别对行列做两次糖果传递。
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cctype>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
inline LL read(){
LL x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
const int MAXN=100005;
int n,m,t,r[MAXN],c[MAXN],s[MAXN];
int main(){
n=read(),m=read(),t=read();
for(int i=1;i<=t;i++){
r[read()]++;
c[read()]++;
}
if(t%n&&t%m){
printf("impossible\n");
return 0;
}
else if(t%n) printf("column ");
else if(t%m) printf("row ");
else printf("both ");
LL ans=0;
if(t%n==0){
for(int i=1;i<=n;i++) s[i]=s[i-1]+(r[i]=r[i]-t/n);
sort(s+1,s+n+1);
for(int i=1;i<=n;i++) ans+=abs(s[i]-s[(n+1)>>1]);
}
if(t%m==0){
for(int i=1;i<=m;i++) s[i]=s[i-1]+(c[i]=c[i]-t/m);
sort(s+1,s+m+1);
for(int i=1;i<=m;i++) ans+=abs(s[i]-s[(m+1)>>1]);
}
printf("%lld\n",ans);
return 0;
}