CH0502 七夕祭( 0x00「基本算法」例题):http://contest-hunter.org:83/contest/0x00%E3%80%8C%E5%9F%BA%E6%9C%AC%E7%AE%97%E6%B3%95%E3%80%8D%E4%BE%8B%E9%A2%98/0502%20%E4%B8%83%E5%A4%95%E7%A5%AD
这题是bzoj1045糖果传递 的二维版本?
bzoj1045糖果传递:https://www.lydsy.com/JudgeOnline/problem.php?id=1045
附上证明:https://blog.youkuaiyun.com/qq_36038511/article/details/80881715
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
long long col[110000],row[110000];
int main()
{
//证明请参考bzoj1045糖果传递
int n,m,t;
long long sl=0,sr=0;
scanf("%d%d%d",&n,&m,&t);
for (int i=1;i<=t;i++)
{
int x,y;
scanf("%d%d",&x,&y);
col[y]++;row[x]++;
}
long long ans=0;
sl=sr=t;
long long xl,xr;
int bk=0;
if (t%n==0)
{
bk+=1;
sr/=n;
for (int i=1;i<=n;i++)
row[i]=row[i]-sr+row[i-1];
sort(row+1,row+1+n);
if (n%2==1) xr=row[n/2+1];
else xr=(row[n/2]+row[n/2+1])/2;
for (int i=1;i<=n;i++)
{
ans+=abs(row[i]-xr);
}
}
if (t%m==0)
{
bk+=2;
sl/=m;
for (int i=1;i<=m;i++) col[i]=col[i]-sl+col[i-1];
sort(col+1,col+1+m);
if (m%2==1) xl=col[m/2+1];
else xl=(col[m/2]+col[m/2+1])/2;
for (int i=1;i<=m;i++)
{
ans+=abs(col[i]-xl);
}
}
if (bk==0) printf("impossible\n");
else
{
if (bk==1) printf("row ");
if (bk==2) printf("column ");
if (bk==3) printf("both ");
printf("%lld\n",ans);
}
}
这个故事告诉我们糖果传递并不是什么水题(哭)