對於三個正方形的位置一共有六種情況。
預處理出(i,j)左上角,左下角,右上角,右下角區域內最大權值的正方形。
列舉分界線更新答案。
剛開始想了乙個錯誤的dp也是蠢啊。
#include#includeview code#include
#include
#include
#include
#include
#include
#include
#include
#include
#define inf 100000000000000ll
#define pa pair#define ll long long
#define n 2505
#define fp(a,b,c) for(int a=b;a<=c;a++)
#define fd(a,b,c) for(int a=c;a>=b;a--)
using
namespace
std;
intn,m,k,ans;
inta[n][n],b[n][n],c[n][n],d[n][n],s[n][n];
intmain()
fd(i,k,n)fd(j,k,m)s[i][j]-=s[i-k][j]+s[i][j-k]-s[i-k][j-k];
fp(i,k,n)fp(j,k,m)a[i][j]=max(s[i][j],max(a[i-1][j],a[i][j-1
]));
fp(i,k,n)fd(j,k,m)b[i][j]=max(s[i][j],max(b[i-1][j],b[i][j+1
]));
fd(i,k,n)fp(j,k,m)c[i][j]=max(s[i][j],max(c[i+1][j],c[i][j-1
]));
fd(i,k,n)fd(j,k,m)d[i][j]=max(s[i][j],max(d[i+1][j],d[i][j+1
]));
fp(i,k,n-k)fp(j,k,m-k)ans=max(ans,a[i][j]+b[i][j+k]+c[i+k][m]);
fp(i,k,n-k)fp(j,k+k,m)ans=max(ans,b[i][j]+d[i+k][j]+a[n][j-k]);
fp(i,k+k,n)fp(j,k,m-k)ans=max(ans,c[i][j]+d[i][j+k]+a[i-k][m]);
fp(i,k,n-k)fp(j,k,m-k)ans=max(ans,a[i][j]+c[i+k][j]+b[n][j+k]);
fp(i,k,n)fp(j,k+k,m-k)ans=max(ans,s[i][j]+a[n][j-k]+b[n][j+k]);
fp(i,k+k,n-k)fp(j,k,m)ans=max(ans,s[i][j]+a[i-k][m]+c[i+k][m]);
printf(
"%d\n
",ans);
return0;
}
BZOJ 3573 公尺特運輸
bzoj 3573 傳送門 一道語文題 轉化後的題意就是使得每個節點的權值都等於 父親節點的權值 兒子數 的最小運算元 能發現一條重要的性質 只要乙個節點確定,所有節點的權值都確定了 於是我們只要列舉 1 n 每個節點權值不變,算出根節點 root 的權值出現過的最多次數 res 用 n res 即...
bzoj3000 Big Number 斯特林公式
給你兩個整數n和k,要求你輸出n!的k進製的位數。對於100 的資料,有2 n 2 31,2 k 200,資料組數t 200。顯然答案就是log k n log k left n right logk n 然後就不會做了otz 斯特林公式 n 2 n ne n n 2 n en n 於是有ans l...
BZOJ4671 斯特林反演
bzoj4671 異或圖 很有意思的題 直接處理顯然很難,我們考慮範圍擴大以求容斥或反演這類的幫助 f i 表示至少有 i 個聯通塊的方案,形如設立 i 個聯通塊輪廓,聯通塊內連邊隨意,聯通塊與聯通塊之間無連邊 g i 表示恰好有 i 個聯通塊的方案,形如設立 i 個聯通塊輪廓,在保證內部聯通的情況...