[DP] CH0502:[算法竞赛进阶指南]七夕祭(0x00「基本算法」例题)

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.csdn.net/qq_36038511/article/details/80881715

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

这个故事告诉我们糖果传递并不是什么水题(哭)

你可能感兴趣的:(算法竞赛进阶指南,DP)