hdu_5110_Alexandra and COS(DP+分塊思想)

題目連接:hdu_5110_Alexandra and COS

題意:

給你一個圖,X代表寶藏,然後有一個船,它的聲納的頻率爲D,定船到寶藏的距離爲Dis=max(abs(x1-x2),abs(y1-y2)),如果D是Dis的約數並且寶藏在船的上方開角45°,那麼這個船就能探測到這個寶藏,現在給你q個詢問,每一個詢問有一個位置x,y和一個聲納的頻率D,問這個船能探測到多少寶藏

題解:

因爲是45°角,所以Dis實際就是abs(y1-y2),然後我們可以對每一個D,DP它45°開角滿足條件的前綴和,不過對每一個D都這樣做,那肯定超時,仔細想想,D越大,直接暴力搜肯定會比DP來的快,因爲直接暴力我們可以每次跳D格來找,所以這裏我們就要分塊,一般分爲sqr=sqrt(n),不過這裏我親測出數據好像當sqr=3時,跑的速度更快,然後我就直接分爲D>3和D<=3來做

這裏DP的方程爲:設dp[i][j][k]爲第i行,第j列,聲納頻率爲k的開角45°滿足條件的前綴和,狀態轉移方程爲dp[i][j][k]=dp[i-k][j-k][k]+dp[i-k][j+k][k]-dp[i-2*k][j][k]+第(i-k)行中[j-k,j+k]滿足條件的點

(沒裝畫圖軟件,畫的有點醜,將就看)下面以D爲2時舉例,假設我們要查詢x=5,y=3這個點,紅色的代表滿足條件的點,藍色的線代表範圍,我們可以看到粉圈內的點加了兩次,所以要減掉,對應的範圍就是dp[i-2*k][j][k]


#include<cstdio>
#include<cstring>
#include<algorithm>
#define F(i,a,b) for(int i=a;i<=b;++i)
using namespace std;

const int N=1007;
int dp[N][N][4],g[N][N],n,m,q;
char in[N][N];
 
int main(){
    while(~scanf("%d%d%d",&n,&m,&q)){
        F(i,1,n)scanf("%s",in[i]+1);
        F(i,1,n)F(j,1,m)g[i][j]=g[i][j-1]+(in[i][j]=='X');
        for(int i=1,*p,kk;i<=n;++i)F(j,1,m)F(k,1,3){
            p=&dp[i][j][k],*p=(in[i][j]=='X'),kk=k<<1;
            if(i>k){		
                if(j>k)*p+=dp[i-k][j-k][k]+g[i-k][j]-g[i-k][j-k];
                else{
                    *p+=g[i-k][j];
                    if(i>kk)*p+=dp[i-kk][j][k]+g[i-kk][j-1];
                }
                if(j+k<=m)*p+=dp[i-k][j+k][k]+g[i-k][j+k-1]-g[i-k][j];
                else{
                    *p+=g[i-k][m]-g[i-k][j];
                    if(i>kk)*p+=dp[i-kk][j][k]+g[i-kk][m]-g[i-kk][j];
                }
                if(i>kk)*p-=dp[i-kk][j][k];
            }
        }
        for(int i=1,c,r,w,ret;i<=q;i++){
            scanf("%d%d%d",&r,&c,&w);
            if(w>3){
                ret=0;
                for(int j=r,lf=c,rt=c;j>0;j-=w,lf=max(lf-w,1),rt=min(m,rt+w))
                    ret+=g[j][rt]-g[j][lf-1];
                printf("%d\n",ret);
            }else printf("%d\n",dp[r][c][w]);
        }
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章