NOIP2015模擬10 22 最大子矩陣

2021-08-21 09:17:36 字數 1401 閱讀 3595

我們將矩陣a中位於第i行第j列的元素記作a[i,j]。乙個矩陣a是酷的僅當它滿足下面的條件:

a[1,1]+a[r,s]<=a[1,s]+a1」>r,1

其中r為矩陣a的行數,s為矩陣a的列數。

進一步,如果乙個矩陣是非常酷的僅當它的每乙個至少包含兩行兩列子矩陣都是酷的。

你的任務是,求出乙個矩陣a中的乙個非常酷的子矩陣b,使得b包含最多元素。

第一行包含兩個整數r,s(2<=r,s<=1000),代表矩陣的行數與列數。

接下來r行每行包括s個整數,代表矩陣中的元素,矩陣中元素的絕對值不大於1000000。

一行乙個整數,代表子矩陣b的元素總數。如果沒有乙個非常酷的子矩陣,輸出0。

輸入1:

3 3

1 4 10

5 2 6

11 1 3

輸入2:

3 3

1 3 1

2 1 2

1 1 1

輸入3:

5 6

1 1 4 0 3 3

4 4 9 7 11 13

-3 -1 4 2 8 11

1 5 9 5 9 10

4 8 10 5 8 8

輸出1:

9 輸出2:

4 輸出3:

15 【樣例3解釋】

在第三個樣例中,子矩陣b的左上角為a[3,2],右下角為a[5,6]。

對於60%的資料,滿足r,s<=350。

對於100%的資料,滿足2<=r,s<=1000,矩陣中元素的絕對值不大於1000000。

顯然對於任意乙個2*2矩陣我們判斷其合法或非法很容易,合法記為1非法記為0。

然後這個圖變成了乙個只有01構成的,0**障礙物。題意轉換為求最大矩形面積,用經典單調棧做法即可。

#include

#include

#include

using

namespace

std;

const

int maxn=1077;

int n,m,a[maxn][maxn],s[maxn],tot=0,up[maxn][maxn],ass=0;

int main()

for(int j=2; j<=m; j++) for(int i=2; i<=n; i++)

for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) if(up[i][j]==1) up[i][j]=0;

s[0]=1;

for(int i=2; i<=n; i++)

s[++tot]=j;

}while(tot)

}printf("%d",ass);

}

NOIP2015模擬10 22 最小代價

洛谷ac通道!一道非常良心卡空間的圖論題,比賽的時候我一交直接mle了。然後才發現自己多按了個0 題目中說要將所有的白點連向最近的黑點。在此之前,我們需要先將多餘的邊剔除掉 m 居然是 n 的兩倍,這能不剔邊嗎!怎麼剔呢?考慮增加乙個超級原點,編號 n 1 最開始向所有黑點連乙個 w 0 的有向邊....

NOIP2015模擬10 22 最小代價

本來在比賽上就想到最小生成樹了,但不相信這道題那麼簡單,然後就沒有然後了。給出一幅由n個點m條邊構成的無向帶權圖。其中有些點是黑點,其他點是白點。現在每個白點都要與他距離最近的黑點通過最短路連線 如果有很多個黑點,可以選取其中任意乙個 我們想要使得花費的代價最小。請問這個最小代價是多少?注意 最後選...

NOIP2015模擬11 5 旅行

經過觀察,可以發現題目有乙個比較不錯的性質 1 一條合法的路徑必須由兩條路徑組成,一條是奇數,另一條是偶數。所以我們可以先把每乙個點到達根節點的路徑求出來,深度為奇數的點放進乙個a aa陣列裡,偶數的放進b bb陣列裡,再給他們分別進行排序。然後進行兩兩結合,先把a陣列裡的所有數跟b1b b1 結合...