题目描述
输入输出格式
输入格式:输入文件名为input.txt
输入文件的第一行为正整数n和正整数R,接下来的n行每行有3个正整数,分别表示 xi,yi ,vi 。
输出格式:输出文件名为output.txt
输出文件仅有一个正整数,表示一颗炸弹最多能炸掉地图上总价值为多少的目标(结果不会超过32767)。
输入输出样例
Solution:
题目特别水,很容易想到二维前缀和模拟一下就$OK$了。(但是我从$MLE$再到一直卡$90$分是什么鬼啊~)
二维前缀和套用容斥的思想,过程比较简单就不多说了,讲下坑点:1、注意不用开$long\;long$,会爆空间。2、玄学地方是在循环中判断边界,不要在循环内判断边界(我也不知道为什么,反正我这样写死活$90$分)
代码:
1 #include<bits/stdc++.h> 2 #define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++) 3 #define il inline 4 #define ll long long 5 #define Max(a,b) ((a)>(b)?(a):(b)) 6 using namespace std; 7 const int N=6000+7; 8 int n,r,x,y,z,a,b; 9 int s[N][N],ans=-2147483646; 10 il int gi(){ 11 int a=0;char x=getchar();bool f=0; 12 while((x<'0'||x>'9')&&x!='-')x=getchar(); 13 if(x=='-')x=getchar(),f=1; 14 while(x>='0'&&x<='9')a=(a<<3)+(a<<1)+x-48,x=getchar(); 15 return f?-a:a; 16 } 17 int main(){ 18 n=gi(),r=gi(); 19 For(i,1,n)x=gi(),y=gi(),a=Max(a,x),b=Max(b,y),s[x+1][y+1]=gi(); 20 For(i,1,5001) { 21 For(j,1,5001)s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+s[i][j]; 22 } 23 for(int i=0;i<=5000-r;i++) for(int j=0;j<=5000-r;j++){ 24 int p=i+r,q=j+r; 25 ans=Max(s[p][q]+s[i][j]-s[i][q]-s[p][j],ans); 26 } 27 cout<<ans; 28 return 0; 29 }