您的位置:首页 > 其它

bzoj 1218: [HNOI2003]激光炸弹 暴力

2017-08-18 08:08 411 查看
题目链接

val[i][j]表示0~第i行,0~第j列所有炸弹价值的和

然后我们暴力枚举所有的正方形左上角那个点

(我是认为左上角为0,0  右下角为5000,5000)

每个正方形的价值可以O(1)算出

简单来说就是二位前缀和

没啦~~

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>

#define inf 999999999

using namespace std;

int val[5050][5050];
int n,m;
int ans=0;

int main(){
scanf("%d%d",&n,&m);
for(int i=0; i<n; i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
val[x][y]+=z;
}
for(int i=1; i<=5000; i++){
val[i][0]+=val[i-1][0];
val[0][i]+=val[0][i-1];
}
for(int i=1; i<=5000; i++){
for(int j=1; j<=5000; j++){
val[i][j]+=val[i-1][j]+val[i][j-1]-val[i-1][j-1];
}
}
for(int i=0; i<=5000-m+1; i++){
for(int j=0; j<=5000-m+1; j++){
int sum=val[i+m-1][j+m-1];
if(j>0)sum-=val[i+m-1][j-1];
if(i>0)sum-=val[i-1][j+m-1];
if(j>0 && i>0)sum+=val[i-1][j-1];
ans=max(ans,sum);
}
}
printf("%d\n",ans);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: