[Bzoj3032] [TYVJ P1924]七夕智(平均リングカード、倉庫位置)

問題の意味

七夕祭りベガ伝説ためと「バレンタインデー」の帽子をラベルされました。
だから、TYVJ七夕祭りは、今年は次の行を開催しました。
Vaniの学生が正常に七夕を過ごすために彼を同行する学生をCLに今年誘わので、彼らはTYVJ七夕まつりプレイを行くことにしました。
TYVJ夏祭り七夕祭りなど11地区の形で。
N行M M総数ストール×N列からなるフェスティバル会場矩形。
広い屋台の範囲が、屋台にしか興味が、このようなたこ焼き、どのようなキャンディアップル、マシュマロ、火災の家として、その一部ををクリア.......
Vaniは以前、七夕祭りのzhqの担当者に連絡し、適切になるように、各列CL関心で屋台の数だけ、各列のCLでの屋台の数興味が多すぎる、会場で手配することができるようにしたいです。
しかしzhqあなたはCLの要件を満たすためにしたい場合は、調整するための唯一の方法は、2台の隣接する屋台を交換することで、屋台がランダムに配置され、完成されている、Vaniに語りました。
隣接する二つのストール、もしそれらが同じ行または隣接する位置の同じ列にある場合にのみ。
zhqはTYVJを主導しているため、開発チームはスペース、第1の位置と、各列の最後の位置を歪めることに成功し、各列は、また、隣人としてカウントされます。
今Vaniはどのように多くの要件を満たすために彼の最も可能なのうちの2つを知りたいと思いました。
この文脈では、どのように多くの屋台は、少なくとも、交換する必要があります。

入力形式

最初の行は、Tは、ストールの数が購入CL表す、三つの整数NとMとTが含まれています。
二つの整数のX、Yの次T線は、CLは、行X及び列Yにおけるストールの関心を表明しました。

出力フォーマット

最初の出力文字列。
Vani要件、両方の出力の両方を満たしている場合、
唯一のように、各列にストールの数であれば、出力行を調整することにより限りCL関心;
場合は、各列CLの関心のような多くの出力におけるストールの数だけカラム;
満たしていない場合、出力は不可能。
出力文字列は、交換の次の最小数の出力不可能ではない場合、文字列の間の空間によって離間しました。

データ範囲

\(1≤N、M≤100000、\)
\(0≤T≤min(N * M、100000)、\)
\(1≤x≤N、\)
\(1≤y≤M\)

#include<bits/stdc++.h>
#define ll long long
using namespace std;

ll x[100010],y[100010];
ll sum[100010];
ll n,m,t;
int main(){
    cin >> n >> m >> t;
    for(int i = 1; i <= t; ++i){
        int xx,yy;
        scanf("%d%d",&xx,&yy);
        x[xx]++; y[yy]++;
    }
    ll ans1 = 0,ans2 = 0;
    int flag1 = 1,flag2 = 1;
    ll ave = 0;
    if(t % n == 0){
        ave = t / n;
        for(int i = 1; i <= n; ++i)
            sum[i] = sum[i - 1] + x[i] - ave;
        sort(sum + 1,sum + n + 1);
        ll mid = (n + 1) >> 1;
        for(int i = 1; i <= n; ++i)
            ans1 += abs(sum[i] - sum[mid]);
    }
    else flag1 = 0;
    if(t % m == 0){
        ave = t / m;
        for(int i = 1; i <= m; ++i)
            sum[i] = sum[i - 1] + y[i] - ave;
        sort(sum + 1,sum + m + 1);
        ll mid = (m + 1) >> 1;
        for(int i = 1; i <= m; ++i)
            ans2 += abs(sum[i] - sum[mid]);
    }
    else flag2 = 0;
    if(flag1 && flag2) cout << "both ";
    else if(flag1) cout << "row ";
    else if(flag2) cout << "column ";
    else cout << "impossible" << endl;
    if(flag1 || flag2) cout << ans1 + ans2 << endl;
    return 0;
} 

おすすめ

転載: www.cnblogs.com/FoxC/p/11417492.html