codeforces675B

  • 这幅画是一个3×3的正方形,每个单元格包含一个从1到n的单个整数,不同的单元格可能包含不同或相等的整数。
  • 四个正方形2×2中的每个正方形中的整数之和等于左上方正方形2×2中的整数之和。
  • 四个元素abcd是已知的,其位置如下图所示。

帮助Vasya找出满足上述所有条件的不同方块的数量。注意,这个数字可能等于0,这意味着Vasya记得有些不对劲。

如果存在包含不同正方形中的两个不同整数的单元,则认为两个正方形是不同的。

输入

输入的第一行包含五个整数Ñ一个bc ^d(1≤  ñ  ≤100 000,1≤  一个,  b,  c ^,  d  ≤  Ñ) -在细胞和四个整数的最大可能值Vasya记得的整数。

产量

打印一个整数 - 不同有效方块的数量。

例子

输入

2 1 1 1 2

产量

2

输入

扫描二维码关注公众号,回复: 3401971 查看本文章
3 3 1 2 3

产量

6

注意

以下是第一个样本的所有可能的绘画。  

在第二个样本中,只有下面显示的绘画满足所有规则。      

这个题一开始是想枚举矩阵A[1][1]和A[2][2]处的所有值,然后······果断超时了QAQ

后来发现,这个矩阵所有2*2的子矩阵都与A[2][2]位置相连,也就是说A[2][2]的值是多少对它们没有影响,所以只需对A[1][1]的值进行从1-n的遍历即可。如果第一个子矩阵的和减去每个子矩阵的和都在所要求的值的范围内(即1—n),则个数+1。

最后不要忘记在结果上乘n!!!!

#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<functional>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
const int maxn = 100;
int A[5][5];
int n;
int a, b, c, d;
int sum1 = 0;
int sum2 = 0;
int sum3 = 0;
int sum4 = 0;
ll ans = 0;
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin >> n >> a >> b >> c >> d;
	memset(A, 0, sizeof(A));
	A[1][2] = a;
	A[2][1] = b;
	A[2][3] = c;
	A[3][2] = d;
	int flag = 0;
	for (int i = 1; i <= n; ++i) {
		A[1][1] = i;
		sum1 = A[1][1] + A[1][2] + A[2][1] + A[2][2];
		sum2 = A[1][2] + A[1][3] + A[2][2] + A[2][3];
		sum3 = A[2][1] + A[2][2] + A[3][1] + A[3][2];
		sum4 = A[2][2] + A[2][3] + A[3][2] + A[3][3];
		if (sum1 - sum2 > n || sum1 - sum2 <= 0 || sum1 - sum3 > n || sum1 - sum3 <= 0 || sum1 - sum4 > n || sum1 - sum4 <= 0)
			continue;
		else
			ans++;
	}
	
		cout << n*ans << endl;//最后不要忘记*n!!!!
	return 0;
}

猜你喜欢

转载自blog.csdn.net/zsnowwolfy/article/details/82792845