P2213 [USACO14MAR]The Lazy Cow S(前缀和)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P2213 [USACO14MAR]The Lazy Cow S(前缀和)相关的知识,希望对你有一定的参考价值。

P2213 [USACO14MAR]The Lazy Cow S(前缀和)

就是计算每个点的曼哈顿距离范围内的和。

每个点的曼哈顿的距离的形状就是一个菱形,我们可以用前缀和来预处理每一行的,就是两个三角形叠在一起。

注意上面和下面三角形计算方式的不同。

时间复杂度: O ( n 3 ) O(n^3) O(n3)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull; 
const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
const int hashmod[4] = 402653189,805306457,1610612741,998244353;
#define mst(a,b) memset(a,b,sizeof a)
#define db double
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define x first
#define y second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define ios ios::sync_with_stdio(false),cin.tie(nullptr) 
void Print(int *a,int n)
	for(int i=1;i<n;i++)
		printf("%d ",a[i]);
	printf("%d\\n",a[n]); 

template <typename T>		//x=max(x,y)  x=min(x,y)
void cmx(T &x,T y)
	if(x<y) x=y;

template <typename T>
void cmn(T &x,T y)
	if(x>y) x=y;

int a[N][N],b[N][N];
int n,k;
int fun(int x,int y)
	int s = 0;
	int mn = max(1,x-k);
	int mx = min(n,x+k);
	for(int i=mn;i<=mx;i++)
		int l,r;
		if(i<=x)
			l = y-(i-(x-k));
			r = y+(i-(x-k));
		
		else 
			l = y-(x+k-i);
			r = y+(x+k-i);
		
		if(l<1) l = 1;
		if(r>n) r = n;
		s+=a[i][r]-a[i][l-1];
	
	return s;

int main()
	
	scanf("%d%d",&n,&k);
	rep(i,1,n) 
		rep(j,1,n)
			scanf("%d",&a[i][j]);
		
	rep(i,1,n)
		rep(j,1,n) a[i][j] = a[i][j-1]+a[i][j];
	int ans = 0;
	rep(i,1,n)
		rep(j,1,n)
			cmx(ans,fun(i,j));
		
	printf("%d\\n",ans);
	return 0;


开发者涨薪指南 48位大咖的思考法则、工作方式、逻辑体系

以上是关于P2213 [USACO14MAR]The Lazy Cow S(前缀和)的主要内容,如果未能解决你的问题,请参考以下文章

[USACO14MAR]浇地Watering the Fields

P2212 [USACO14MAR]浇地Watering the Fields

$P2212 [USACO14MAR]浇地Watering the Fields$

[USACO14MAR]浇地Watering the Fields

[USACO14MAR] Watering the Fields S - 最小生成树

题解Luogu P2212 [USACO14MAR] 浇地 Watering the Fields 最小生成树