洛谷P3625 APIO2009 採油區域

2022-08-11 07:45:09 字數 1239 閱讀 4705

portal

給出乙個\(n\times m(n,m\leq1500)\)的矩陣,從中選出\(3\)個互不相交的\(k\times k\)方陣,使得被選出的數的和最大。

奇怪做法...

三個矩形分別在三個部分中,把矩形劃分成三部分只有這六種。首先搞出\(s[i][j]\)表示以\((i,j)\)為右下角的\(k\times k\)方陣的和,然後搞出\(f_1[i][j]\)表示\((1,1)-(i,j)\)中\(s\)的最大值,\(f_2[i][j]\)表示\((1,m)-(i,j)\)中\(s\)的最大值,\(f_3[i][j]\)表示\((n,m)-(i,j)\)中\(s\)的最大值,\(f_4[i][j]\)表示\((n,1)-(i,j)\)中\(s\)的最大值。列舉橫豎劃分在哪就可以解決四種。

平行的那兩種搞出行/列最大值然後瞎搞即可。

時間複雜度\(o(nm)\)。

//[apio2009]oil

#include const int n=2000;

inline int max(int x,int y)

int n,m,k,a[n][n];

int pre[n][n],s[n][n],f1[n][n],f2[n][n],f3[n][n],f4[n][n],row[n],col[n];

int main()

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

for(int j=1;j<=m;j++)

row[i]=max(row[i],s[i][j]),col[j]=max(col[j],s[i][j]);

for(int i=k;i<=n-k-k;i++)

for(int j=i+k,mid=row[j];j<=n-k;j++,mid=max(mid,row[j]))

ans=max(ans,f1[i][m]+mid+f3[j+1][1]);

for(int i=k;i<=n-k-k;i++)

for(int j=i+k,mid=col[j];j<=n-k;j++,mid=max(mid,col[j]))

ans=max(ans,f1[n][i]+mid+f3[1][j+1]);

printf("%d\n",ans);

return 0;

}

寫的我好難受...

洛谷P3627 APIO2009 搶掠計畫

題目大意 給你一張 n n leqslant5 times10 5 個點 m m leqslant5 times10 5 條邊的有向圖,有點權,給你起點和一些可能的終點。問從起點開始,到任意乙個終點經過的點權和的最大值是多少。題解 先把有向圖縮點,然後從起點跑最長路,對每個終點取個最大值即可 卡點 ...

洛谷 P3629 APIO2010 巡邏

題目在這裡 這是乙個紫題,當然很難。我們往簡單的想,不建立新的道路時,從1號節點出發,把整棵樹上的每條邊遍歷至少一次,再回到1號節點,會恰好經過每條邊兩次,路線總長度為 2 n 1 根據樹的深度優先遍歷思想,很容易證明這個結論,因為每條邊必然被遞迴一次,回溯一次。建立1條新道路之後,因為新道路必須恰...

洛谷P5443 APIO2019 橋梁

apio場外選手沒事休閒做題。看了yyb的題解才把這題做出來 對操作進行分塊,把每 text 個操作分成1組,裡面大概有2類 沒被修改過的和被修改過的。接著對塊內詢問進行離線。對於沒有修改過的 我們可以直接排序然後把他們加入並查集。對於修改過的,我們看他的時間是否大於當前操作的時間,如果大於則加入原...