Codeforces Round 959 (Div. 1 + Div. 2 ABCDEFG 题) 文字讲解+视频讲解

Problem A. Diverse Game

Statement

给定 n × m n\times m n×m 的矩形 a a a a a a 中的每一个数均在 1 ∼ n m 1\sim nm 1nm 之间且互不相同。求出 n × m n\times m n×m 的矩形 b b b b b b 中的每一个数均在 1 ∼ n m 1\sim nm 1nm 之间且互不相同,同时 a i , j ≠ b i , j a_{i,j}\ne b_{i,j} ai,j=bi,j

Solution

注意到 a a a 如果拉长为一个序列,则是一个长为 n m nm nm 的排列。故,如果直接翻转 a a a,则长度为偶数的时候是可行的;长度为奇数的时候,中间的位置没变,只需将第一个位置与中间的位置交换即可。

Code

void solve() {
   
	int n, m, x;
	cin >> n >> m;

	std::vector<int> opt;
	for (int i = 1; i <= n * m; i ++) cin >> x, opt.push_back(x);
	if (n * m == 1) {
   
		cout << -1 << endl;
		return;
	}

	reverse(opt.begin(), opt.end());
	if (opt.size() & 1) swap(opt[0], opt[opt.size() / 2]);
	for (int i = 1; i <= n * m; i ++) {
   
		cout << opt[i - 1] << " ";
		if (i % m == 0) cout << endl;
	}
}

Problem B. Fun Game

Statement

给定一个长为 n n n 的二进制序列,接下来可以进行无限次操作:

  • 选择 l , r l,r l,r,将 s i s_i si 变为 s i − l + 1 ⊕ s i s_{i-l+1}\oplus s_i sil+1si

确定是否能从 s s s 序列变为 t t t 序列。

Solution

考察 s s s 中第一个出现 1 1 1 的位置,那么后面需要翻转的位置一定可以通过这个 1 1 1 来翻转状态。形式化的,若需要变换的位置为 i i i,第一次出现的位置为 j j j,则选择区间 l = i − j + 1 , r = i l=i-j+1,r=i l=ij+1,r=i 即可在不改变其他位置的前提下(因为 j j j 前面全为 0 0 0),翻转 i i i 位置。最后 j j j 位置自己异或自己即可。

但是如果前面存在 i i i,使得 s i = 0 , t i = 1 s_i=0,t_i=1 si=0,ti=1,则必然不存在方案,输出 NO;反之输出 YES

Code

void solve() {
   
	int n;
	string s, t;
	cin >> n >> s >> t;

	bool ok = 0;
	for (int i = 0; i < n; i ++) {
   
		if (s[i] == '0' && t[i] == '1') {
   
			cout << "NO" << endl;
			return;
		}
		if (s[i] == '1') {
   
			cout << "YES" << endl;
			return;
		}
	}
	cout << "YES" << endl;
}

Problem C. Hungry Games

Statement

给定长为 n n n 的序列 a a a 以及变量 g g g(初始为 0 0 0),选择 l , r l,r l,r,依次遍历 l ∼ r l\sim r lr 中的每一个数, g = g + a i g=g+a_i g=g+ai,若 g > x g>x g>x,则令 g = 0 g=0 g=0。问存在多少个 l , r l,r l,r 使得最终 g g g 的值不为 0 0 0

Solution

考虑枚举每一个

你可能感兴趣的:(Codeforces,算法)