AcWing 105. 七夕祭
七夕节因牛郎织女的传说而被扣上了「情人节」的帽子。
于是TYVJ今年举办了一次线下七夕祭。
Vani同学今年成功邀请到了cl同学陪他来共度七夕,于是他们决定去TYVJ七夕祭游玩。
TYVJ七夕祭和11区的夏祭的形式很像。
矩形的祭典会场由N排M列共计N×M个摊点组成。
虽然摊点种类繁多,不过cl只对其中的一部分摊点感兴趣,比如章鱼烧、苹果糖、棉花糖、射的屋……什么的。
Vani预先联系了七夕祭的负责人zhq,希望能够通过恰当地布置会场,使得各行中cl感兴趣的摊点数一样多,并且各列中cl感兴趣的摊点数也一样多。
不过zhq告诉Vani,摊点已经随意布置完毕了,如果想满足cl的要求,唯一的调整方式就是交换两个相邻的摊点。
两个摊点相邻,当且仅当他们处在同一行或者同一列的相邻位置上。
由于zhq率领的TYVJ开发小组成功地扭曲了空间,每一行或每一列的第一个位置和最后一个位置也算作相邻。
现在Vani想知道他的两个要求最多能满足多少个。
在此前提下,至少需要交换多少次摊点。
#include<bits/stdc++.h> #define N 1000010 #define ll long long using namespace std; int n,m,t; ll h[N],l[N]; ll cala(ll a[N],int x) { ll f[N],ans=0;f[0]=0; for(int i=1;i<=x;i++)f[i]=f[i-1]+(a[i]-t/x); sort(f+1,f+x+1); for(int i=1;i<=x;i++)ans+=abs(f[i]-f[(x+1)>>1]); return ans; } int main() { cin>>n>>m>>t; for(int i=1,x,y;i<=t;i++){scanf("%d%d",&x,&y); h[x]++;l[y]++;} if(t%n==0&&t%m==0)printf("both %lld\n",cala(h,n)+cala(l,m)); else if((t%n)&&(t%m))puts("impossible"); else if(t%n)printf("column %lld\n",cala(l,m)); else printf("row %lld\n",cala(h,n)); return 0; }

浙公网安备 33010602011771号