Codeforces Round #524 (Div. 2) A 模拟 B数学 C 模拟 ,细节

A

Code:

#include <bits/stdc++.h>
#define LL long long
using namespace std;
int main(){
	int n , k ;  // 2 5 8 
	cin >> n >> k ; 
	LL k1 = 2 * n ; 
	LL k2 = 5 * n ; 
	LL k3 = 8 * n ;

	k1 = k1 / k + ( k1 % k != 0 ) ; 
	k2 = k2 / k + ( k2 % k != 0 ) ; 
	k3 = k3 / k + ( k3 % k != 0 ) ; 
	cout << k1 + k2 + k3 << endl;
	return 0 ; 
}

B
思路:观察得sn 的规律是 -1 , 1 , -2 ,2 …这样。直接求就行了
Code:

#include <bits/stdc++.h>
#define LL long long
using namespace std;
int main(){
	int q;
	cin >> q ;
	int l , r ;
	while( q-- ){
		cin >> l >> r ;
		l -- ; 
		LL ll = l / 2 + ( l % 2 != 0 ) ; 
		if( l % 2 ) ll = 0 - ll ; 
		if( !l ) ll = 0 ; 
		LL rr = r / 2 + ( r % 2 != 0 ) ; 
		if( r % 2 ) rr = 0 - rr ; 
		//cout << ll << ' ' << rr << endl;
		cout << rr - ll << endl ;	
	}
	return 0 ; 
}

C
题意:给你一个m*n的矩阵黑白相间,然后给两个小矩阵的左下和右上的坐标,第一个矩阵范围内的颜色都变成白,第二个都变成黑(按顺序)。问最后多少黑多少白。
思路:
先计算最初的黑白个数。
然后计算第一个,第二个矩阵改变的情况,不考虑相交区域,这个容易计算。
最后将相交区域求出左下与右上坐标,计算黑->黑的改变情况即可。因为刚才没有考虑相交区域,只是简单的将这块区域由最初形态转化为黑色,因此只是将白色转为黑,第一个矩形将这块区域的黑转为白的那块并没有计算,所以是将最初的黑->黑。

Code:

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define LL long long
using namespace std;
int main(){
	ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);  
	int T ; 
	cin >> T ;
	while( T-- ){
		LL W , B ;
		LL n , m ; 
		cin >> n >> m ; //y x 
		LL x1 , y1 , x2 , y2 ; 
		LL x3 , y3 , x4 , y4 ; 
		W = n * m / 2 ; 
		B = W ; 
		if( ( ( n * m ) % 2 ) ) W ++ ;
		cin >> x1 >> y1 >> x2 >> y2 ; 
		cin >> x3 >> y3 >> x4 >> y4 ; 
		
		n = y2 - y1 + 1 ; 
		m = x2 - x1 + 1 ; 
		W += n * m / 2 ; 
		B -= n * m / 2 ; 
		if( ( ( n * m ) % 2 ) && ( ( x1 + y1 ) % 2 ) ) { B -- ; W ++ ;}

		n = y4 - y3 + 1 ; 
		m = x4 - x3 + 1 ; 
		W -= n * m / 2 ;
		B += n * m / 2 ; 
		if( ( ( n * m ) % 2 ) && ( ( x3 + y3 ) % 2 ) == 0 ) { W -- ; B ++ ;}

		LL x5 = max( x1 , x3 ) ; 
		LL x6 = min( x2 , x4 ) ; 
		LL y5 = max( y1 , y3 ) ; 
		LL y6 = min( y2 , y4 ) ;
		if( x6 >= x5 && y6 >= y5 ){
			n = y6 - y5 + 1; 
			m = x6 - x5 + 1; 
			W -= n * m / 2 ; 
			B += n * m / 2 ; 
			if( ( ( n * m ) % 2 ) && ( ( x5 + y5 ) % 2 ) ) {  B ++ ; W -- ; }
		}

		cout << W << ' ' << B << endl;
	}
	return 0 ; 
}

猜你喜欢

转载自blog.csdn.net/FrankAx/article/details/84502405