天天看點

codeforces675B

  • 這幅畫是一個3×3的正方形,每個單元格包含一個從1到n的單個整數,不同的單元格可能包含不同或相等的整數。
  • 四個正方形2×2中的每個正方形中的整數之和等于左上方正方形2×2中的整數之和。
  • 四個元素a,b,c和d是已知的,其位置如下圖所示。
codeforces675B

幫助Vasya找出滿足上述所有條件的不同方塊的數量。注意,這個數字可能等于0,這意味着Vasya記得有些不對勁。

如果存在包含不同正方形中的兩個不同整數的單元,則認為兩個正方形是不同的。

輸入

輸入的第一行包含五個整數Ñ,一個,b,c ^和d(1≤  ñ  ≤100 000,1≤  一個,  b,  c ^,  d  ≤  Ñ) -在細胞和四個整數的最大可能值Vasya記得的整數。

産量

列印一個整數 - 不同有效方塊的數量。

例子

輸入

2 1 1 1 2
      

産量

2
      

輸入

3 3 1 2 3
      

産量

6
      

注意

以下是第一個樣本的所有可能的繪畫。 

codeforces675B
codeforces675B

在第二個樣本中,隻有下面顯示的繪畫滿足所有規則。 

codeforces675B
codeforces675B
codeforces675B
codeforces675B
codeforces675B
codeforces675B

這個題一開始是想枚舉矩陣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;
}
           
上一篇: codeforces 798B
下一篇: codeforces131B