[HNOI2003]激光炸弹

[HNOI2003]激光炸弹

http://www.nowcoder.com/questionTerminal/3df864279f5f4c03b809961f6815f165

题解写重了 参考https://blog.nowcoder.net/n/62b1d5cfab0647cbae38a868fdd0e713
本题图片说明
图片说明
按上图
设置M[i][j]记录以(1,1)为左上角端点 以(i,j)为右下角端点的矩形
大矩形=红色矩形+青色矩形-黑色重叠矩形+(i,j)点的数值
不难发现 按M[i][j]=M[i-1][j]+M[i][j-1]-M[i-1][j-1]+a[i][j]前缀即可
接下来直接枚举左上角(i,j)边长为k的正方形
M[i+k-1][j+k-1]-M[i+k-1][j-1]-M[i-1][j+k-1]+M[i-1][j-1]
注意细节 比如边界

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=5e3+7;
int  a[maxn][maxn];
int  M[maxn][maxn]={0};
int main()
{
  int  n,k;
  scanf("%d%d",&n,&k);
  memset(M,0,sizeof(M));
  int l=k,r=k;///这个很重要,最小的边界范围
  for (int i=0;i<n;++i)
  {
    int x,y,t;
    scanf("%d%d%d",&x,&y,&t);
    l=max(l,x+1);///寻找边界
    r=max(r,y+1);///寻找边界
    a[x+1][y+1]=t;
  }
  for (int i=1;i<=l;++i)
  {
    for (int j=1;j<=r;++j)
    {
        M[i][j]=M[i-1][j]+M[i][j-1]-M[i-1][j-1]+(a[i][j]);
    }
  }

  int  cnt=0;
  for (int i=1;i<=l-k+1;++i)///注意边界条件 只要l-i+1<=k即可
  {
    for (int j=1;j<=r-k+1;++j)///注意边界条件 只要r-i+1<=k即可
    {

      if (M[i+k-1][j+k-1]-M[i+k-1][j-1]-M[i-1][j+k-1]+M[i-1][j-1])///是i+k-1并非i+k 
    ///因为是从M[k]枚举到M[l]  
      {
        cnt=max(cnt,M[i+k-1][j+k-1]-M[i+k-1][j-1]-M[i-1][j+k-1]+M[i-1][j-1]);
      }
    }
  }
  printf("%d\n",cnt);
  return 0;
}
全部评论

相关推荐

三题看不懂四题不明白二题无法AC&nbsp;T=int(input())&nbsp;for&nbsp;_&nbsp;in&nbsp;range(T):&nbsp;n=int(input())&nbsp;s=input().split()&nbsp;k,mx=1,1&nbsp;for&nbsp;i&nbsp;in&nbsp;range(len(s)-1):&nbsp;if&nbsp;len(s[i])&lt;len(s[i+1]):&nbsp;k+=1&nbsp;elif&nbsp;len(s[i])==len(s[i+1]):&nbsp;if&nbsp;s[i]&lt;=s[i+1]:&nbsp;k+=1&nbsp;...
恭喜臭臭猴子:第二题用栈就行。合法的括号直接出栈了,剩下的是不合法的,肯定都得一个一个走。出入栈的过程中得记下进栈的括号的下标。最后栈里剩下的括号如果相邻两个的下标不连续,说明它们中间有一个合法的括号序列被出栈,结果加一
投递拼多多集团-PDD等公司10个岗位 > 拼多多求职进展汇总 笔试
点赞 评论 收藏
分享
头像
04-17 09:29
已编辑
湖南农业大学 后端
睡姿决定发型丫:本硕末9也是0offer,简历挂了挺多,只有淘天 美团 中兴给了面试机会,淘天二面挂,美团一面kpi面,中兴一面感觉也大概率kpi(虽然国企,但一面0技术纯聊天有点离谱吧)
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
05-01 13:13
ecece:这么明目张胆虚报就业率啊
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务