NOIP2013模擬 七夕祭

2021-07-11 02:13:48 字數 2763 閱讀 8164

description

七夕節因牛郎織女的傳說而被扣上了「情人節」的帽子。於是tyvj今年舉辦了一次線下七夕祭。vani同學今年成功邀請到了cl同學陪他來共度七夕,於是他們決定去tyvj七夕祭遊玩。

tyvj七夕祭和11區的夏祭的形式很像。矩形的祭典會場由n排m列共計n×m個攤點組成。雖然攤點種類繁多,不過cl只對其中的一部分攤點感興趣,比如章魚燒、蘋果糖、棉花糖、射的屋……什麼的。vani預先聯絡了七夕祭的負責人zhq,希望能夠通過恰當地布置會場,使得各行中cl感興趣的攤點數一樣多,並且各列中cl感興趣的攤點數也一樣多。

不過zhq告訴vani,攤點已經隨意布置完畢了,如果想滿足cl的要求,唯一的調整方式就是交換兩個相鄰的攤點。兩個攤點相鄰,當且僅當他們處在同一行或者同一列的相鄰位置上。由於zhq率領的tyvj開發小組成功地扭曲了空間,每一行或每一列的第乙個位置和最後乙個位置也算作相鄰。現在vani想知道他的兩個要求最多能滿足多少個。在此前提下,至少需要交換多少次攤點。

input

第一行包含三個整數n和m和t。t表示cl對多少個攤點感興趣。

接下來t行,每行兩個整數x, y,表示cl對處在第x行第y列的攤點感興趣。

output

首先輸出乙個字串。如果能滿足vani的全部兩個要求,輸出both;如果通過調整只能使得各行中cl感興趣的攤點數一樣多,輸出row;如果只能使各列中cl感興趣的攤點數一樣多,輸出column;如果均不能滿足,輸出impossible。

如果輸出的字串不是impossible, 接下來輸出最小交換次數,與字串之間用乙個空格隔開。

sample input

樣例輸入1

2 3 4

1 32 1

2 22 3

樣例輸入2

3 3 3

1 32 2

2 3sample output

樣例輸出1

row 1

樣例輸出2

both 2

data constraint

對於30% 的資料,n, m≤100。

對於70% 的資料,n, m≤1000。

對於100% 的資料,1≤n, m≤100000,0≤t≤min(nm, 100000),1≤x≤n,1≤y≤m。

題解:題意

題目大意是說給你一副n行m列的圖,圖裡面有t個點是某人喜歡的點,他希望,每行的點的分布個數都相等(row的情況),或者是每列的點的分布個數都相等(colunm的情況),或者是每行每列的點分布個數都相等(both的情況)

方法

方法1:

暴力搜尋。有多暴力就多暴力,有多血腥就多血腥,要相信騙分最神奇,暴力出奇蹟

列舉從第 k 個位置開始(1<=k<=n),按照題目描述的情況交換目標位置,累計進答案。最後取最小值。

時間複雜度 o(n^2),預計得分 70 分。

方法2:

至於滿分的方法,我們可以發現,要想每行的點的個數相同,n就必須得滿足是t的約數,同理,m必須得滿足是t的約數。否則就「impossible」。有了這個想法,思路就很清楚了。

我們可以設乙個row陣列,表示每行離每行的目標答案(t/n)差多少,

同理,我們可以設乙個column陣列,表示每列離每列的目標答案(t/n)差多少。

之後,就可以分類討論了。

首先對於row的情況,可以設乙個字首和pre1陣列。如果從第k個位置開始,那麼第i堆和第i+1堆交換的次數就是|prei-prek|,總代價就是|pre1-prek|+|pre2-prek|+|pre3-prek|+……+|pren-prek|,可以發現當sk是中位數時,很明顯他的代價最小。於是就可以將字首和進行排序,找出他的中位數mid,於是就可以記錄答案了,ans=|prei-mid|.

至於字首和的求法,就是pre[i]=pre[i-1]+row[i];

字首和是為了方便處理後面的東西。

同理對於column的情況處理起來是相同的。

至於「both」就當然是把兩個答案加起來了啦~~~~。

於是時間複雜度就很小了變成o(nlogn+mlogm)(最壞的both情況)。

期望得分100

code

#include 

#include

#include

#include

#include

#define fo(i,a,b) for (int i=a;i<=b;i++)

#define fd(i,a,b) for (int i=a;i>=b;i--)

#define n 100005

using namespace std;

int n,m,t;

int a[n],b[n],row[n],column[n],pre1[n],pre2[n];

long long ans=0;

int main()

if (t%n!=0 && t%m!=0)

if (tm)

fo(i,1,n) row[i]-=t/n;

fo(i,1,m) column[i]-=t/m;

if (t%n==0)

if (t%m==0)

if (t%n==0 && t%m==0) printf("both %lld\n",ans);

else

if (t%n==0) printf("row %lld\n",ans);

else

if (t%m==0) printf("column %lld\n",ans);

return

0;}

NOIP2013模擬 七夕祭

第一行包含三個整數n和m和t。t表示cl對多少個攤點感興趣。接下來t行,每行兩個整數x,y,表示cl對處在第x行第y列的攤點感興趣。首先輸出乙個字串。如果能滿足vani的全部兩個要求,輸出both 如果通過調整只能使得各行中cl感興趣的攤點數一樣多,輸出row 如果只能使各列中cl感興趣的攤點數一樣...

NOIP2013模擬 七夕祭

題目描述輸入 第一行包含三個整數n和m和t。t表示cl對多少個攤點感興趣。接下來t行,每行兩個整數x,y,表示cl對處在第x行第y列的攤點感興趣。輸出 首先輸出乙個字串。如果能滿足vani的全部兩個要求,輸出both 如果通過調整只能使得各行中cl感興趣的攤點數一樣多,輸出row 如果只能使各列中c...

七夕祭 模擬

有乙個會場由 n role presentation style position relative nn排 m role presentation style position relative m m列共計n m role presentation style position relative...