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;
}

 

posted @ 2021-01-29 11:06  君与  阅读(70)  评论(0)    收藏  举报