1. 程式人生 > >前綴和與差分專題練習

前綴和與差分專題練習

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;
}

前綴和與差分專題練習