[思路题][BZOJ3032]七夕祭:绝对值不等式

分析:

可以看成分别对行列做两次糖果传递

代码:

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

猜你喜欢

转载自www.cnblogs.com/ErkkiErkko/p/9595627.html