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類 沒被修改過的和被修改過的。接著對塊內詢問進行離線。對於沒有修改過的 我們可以直接排序然後把他們加入並查集。對於修改過的,我們看他的時間是否大於當前操作的時間,如果大於則加入原...