目录:
题目:
分析:
首先,同一列中的交换只会影响行,同一行中的交换只会影响列。所以我们可以分开考虑行与列这两个问题。我做题时有一个疑问——空间结构会不会影响交换呢?如果两列中在同一行均有喜爱摊位,是不可以交换的。emmm,自己画个图就会发现我多虑了。
那若是只考虑行(或列),我们自然而然联想到环形均分纸牌模型——每行(或列)原始所含有的喜爱摊位数量为初值,相邻两个行(或列)可以互相给,要求给的摊次最少。进而,设个未知数,列个方程,利用绝对值不等式得出结论,就可以用中位数解决了
复杂度O(nlogn + mlogm)。
代码:
#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define LL long long
using namespace std;
inline LL read() {
LL d=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
return d*f;
}
int x[110000],y[110000],ne[110000];
int main()
{
int n=read(),m=read(),t=read();
if(t%n==0&&t%m==0) printf("both ");
else if(t%n==0) printf("row ");
else if(t%m==0) printf("column ");
else {printf("impossible ");return 0;}
int a,b;
for(int i=1;i<=t;i++)
{
a=read();b=read();
x[a]++;y[b]++;
}
int e,mid;long long ans=0;
if(t%n==0)
{
e=t/n;
for(int i=1;i<=n;i++) x[i]-=e;
for(int i=1;i<=n;i++)
ne[i]=ne[i-1]+x[i];
sort(ne+1,ne+1+n);
mid=(n+1)/2;
for(int i=1;i<=n;i++)
ans+=(long long)abs(ne[i]-ne[mid]);
}
if(t%m==0)
{
memset(ne,0,sizeof(ne));
e=t/m;
for(int i=1;i<=m;i++) y[i]-=e;
for(int i=1;i<=m;i++)
ne[i]=ne[i-1]+y[i];
sort(ne+1,ne+1+m);
mid=(m+1)/2;
for(int i=1;i<=m;i++)
ans+=(long long)abs(ne[i]-ne[mid]);
}
printf("%lld",ans);
return 0;
}