yuwj  

codeforces 1056 div2

写在前面

喜报,上大分了

图片

A

n 个人淘汰剩一人需要 n-1 轮,n-1 个人淘汰掉需要 n-2 轮,最后一轮决胜 1 轮

ans = n-1 + n-2 + 1

void Solve(){
	cin >> n;
	cout << 2*n-2 << '\n';
}

B

注意到只有一个不能的是无法构造的,其他都可以

直接构造,

从上到下从左到右遍历数组,

在第一行放 RLLLL,剩下的还有就全部转到第一行,放 UUU...

之后全部放 RRR...肯定保证出去

void Solve(){
	cin >> n >> k;
	if(k == n*n-1) return cout <<"NO\n", void();
	k = n*n-k;
	vector<char> ans(n*n+1);
	int i=1;
	if(k)ans[i++] = 'R',--k;
	for(;i<=n&&k;++i,--k) ans[i]='L';
	for(;i<=n*n && k; ++i, --k) ans[i] = 'U';

	for(;i<=n*n;++i)ans[i] = 'R';
	cout << "YES\n";
	for(int i=1;i<=n*n;++i) {
		cout << ans[i];
		if(i%n ==0) cout << '\n';
	}
}

C

注意到条件非常严格,所以猜测答案非常小,发现只能有两种答案

首先根据你看到我肯定也能看到的原则把 abs(num[i-1] - num[i]) > 2 的淘汰掉,这样的情况必然无解

由于最多只有两种情况,只要枚举构造两种情况即可,就是枚举第一个放 L,或者 R,然后构造,根据相邻关系选择方向,最后检查一下,完事

void Solve(){
	cin >> n;
	vector<int> num(n+1);
	For(i,1,n) cin >> num[i];
	for(int i = 2; i<=n; ++i){
		if(abs(num[i] - num[i-1]>1)) return cout << 0 << '\n', void();
	}

	auto work = [&](char ch)->int{
		int cur = ch;
		vector<char> vec(n+1);
		vec[1] = ch;
		for(int i=2;i<=n;++i){
			if(num[i-1] == num[i]){
				cur = (cur == 'L' ? 'R' : 'L');
			}else if(num[i-1] > num[i]){
				if(vec[i-1] != 'R') return 0;
				cur = 'R';
			}else{
				if(vec[i-1] != 'L') return 0;
				cur = 'L';
			}
			vec[i] = cur;
		}
		vector<int> L(n+1), R(n+2);
		for(int i=1;i<=n;++i){
			L[i] = L[i-1] + (vec[i] == 'L');
		}
		for(int i=n;i>=1;--i){
			R[i] = R[i+1] + (vec[i] == 'R');
		}
		
		for(int i=1;i<=n;++i){
			if(L[i]+R[i] != num[i]) return 0;
		}
		return 1;
	};

	int ans = work('L') + work('R');
	cout << ans << '\n';
}
posted on 2025-10-06 03:03  xiaowang524  阅读(282)  评论(0)    收藏  举报