【暴力】JZOJ 2317 心中報情

LinkLink

JZOJJZOJ 23172317

DescriptionDescription

現在平面上有k個矩陣,每個矩陣有統計的代價,若有兩個矩陣相交了, 請計算兩個矩陣所包含的每一個元素的價值之和(相交部分只計算一次),再減去兩個矩陣的代價,求最大的這個式子答案

InputInput

在這裏插入圖片描述

OutputOutput

在這裏插入圖片描述

SampleSample InputInput

在這裏插入圖片描述

SampleSample OutputOutput

在這裏插入圖片描述

HintHint

在這裏插入圖片描述
在這裏插入圖片描述

TrainTrain ofof ThoughtThought

直接暴力枚舉每一對矩陣就好了

CodeCode

#include<iostream>
#include<cstdio>

using namespace std;

int n, m, k;
long long s[1005][1005], ans = -2147483647000000;

struct Matrix
{
	long long x0, y0, x1, y1, c;
}M[1005];

int read()
{
	int x = 0, flag = 1;
	char ch = getchar();
	while (ch < '0' || ch > '9') {if (ch == '-') flag = -1; ch = getchar();}
	while (ch >= '0' && ch <= '9') {x = (x << 3) + (x << 1) + ch - '0'; ch = getchar();}
	return x * flag;
}

int main()
{
	freopen("bti.in", "r", stdin);
	freopen("bti.out", "w", stdout);
	n = read(); m = read(); k = read();
	for (int i = 1; i <= n; ++i)
		for (int j = 1; j <= m; ++j)
			s[i][j] =(long long) (s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + read());//計算二維前綴和
	for (int i = 1; i <= k; ++i)
		M[i].x0 = read(), M[i].y0 = read(), M[i].x1 = read(), M[i].y1 = read(), M[i].c = read();
	for (int i = 1; i <= k; ++i)
	 for (int j = i + 1; j <= k; ++j)
	 {
	 	long long x0 = max(M[i].x0, M[j].x0);
		long long x1 = min(M[i].x1, M[j].x1); 
		long long y0 = max(M[i].y0, M[j].y0);
	 	long long y1 = min(M[i].y1, M[j].y1);
	 	if (x0 <= x1 && y0 <= y1)
	 	{
			long long s1 = s[M[i].x1][M[i].y1] + s[M[i].x0 - 1][M[i].y0 - 1] - s[M[i].x1][M[i].y0 - 1] - s[M[i].x0 - 1][M[i].y1];
	 		long long s2 = s[M[j].x1][M[j].y1] + s[M[j].x0 - 1][M[j].y0 - 1] - s[M[j].x1][M[j].y0 - 1] - s[M[j].x0 - 1][M[j].y1];
		 	long long s3 = s[x1][y1] + s[x0 - 1][y0 - 1] - s[x0 - 1][y1] - s[x1][y0 - 1];//相交部分
		 	ans = max(ans, s1 + s2 - s3 - M[i].c - M[j].c);
		 }
	 }
	if (ans == -2147483647000000) printf("F");
	 else printf("%lld", ans);
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章