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...