前綴和與差分專題練習
阿新 • • 發佈:2019-02-16
for 前綴 noi digi 解決 har bit temp clu
前綴和
算高維的前綴和的時候一般不是去容斥,而是對每一維單獨做,做維數那麽多次。
BZOJ1218 [HNOI2003]激光炸彈
一種新型的激光炸彈,可以摧毀一個邊長為R的正方形內的所有的目標。現在地圖上有n(N<=10000)個目標,用整數Xi,Yi(其值在[0,5000])表示目標在地圖上的位置,每個目標都有一個價值。激光炸彈的投放是通過衛星定位的,但其有一個缺點,就是其爆破範圍,即那個邊長為R的正方形的邊必須和x,y軸平行。若目標位於爆破正方形的邊上,該目標將不會被摧毀。
前綴和解決,時間復雜度\(O(n^2)\)。
#include<bits/stdc++.h> #define rg register #define il inline #define co const template<class T>il T read(){ rg T data=0,w=1; rg char ch=getchar(); while(!isdigit(ch)){ if(ch=='-') w=-1; ch=getchar(); } while(isdigit(ch)) data=data*10+ch-'0',ch=getchar(); return data*w; } template<class T>il T read(rg T&x){ return x=read<T>(); } typedef long long ll; co int N=5e3+2; int s[N][N]; int main(){ // freopen(".in","r",stdin); // freopen(".out","w",stdout); rg int n=read<int>(),r=read<int>(); for(rg int i=1;i<=n;++i){ rg int x=read<int>()+1,y=read<int>()+1,v=read<int>(); s[x][y]+=v; } for(rg int i=1;i<N;++i) for(rg int j=2;j<N;++j) s[i][j]+=s[i][j-1]; for(rg int i=1;i<N;++i) for(rg int j=2;j<N;++j) s[j][i]+=s[j-1][i]; rg int ans=0; for(rg int i=r;i<N;++i) for(rg int j=r;j<N;++j) ans=std::max(ans,s[i][j]-s[i-r][j]-s[i][j-r]+s[i-r][j-r]); printf("%d\n",ans); return 0; }
前綴和與差分專題練習