Codeforces Round 941 (Div. 2 ABCDE题) 视频讲解

A. Card Exchange

Problem Statement

You have a hand of n n n cards, where each card has a number written on it, and a fixed integer k k k. You can perform the following operation any number of times:

  • Choose any k k k cards from your hand that all have the same number.
  • Exchange these cards for k − 1 k-1 k−1 cards, each of which can have any number you choose (including the number written on the cards you just exchanged).

Here is one possible sequence of operations for the first example case, which has k = 3 k=3 k=3:

What is the minimum number of cards you can have in your hand at the end of this process?

Input

Input

The first line of the input contains a single integer t t t ( 1 ≤ t ≤ 500 1 \le t \le 500 1≤t≤500) --- the number of test cases. The description of the test cases follows.

The first line of each test case contains two integers n n n and k k k ( 1 ≤ n ≤ 100 1 \le n \le 100 1≤n≤100, 2 ≤ k ≤ 100 2 \le k \le 100 2≤k≤100) --- the number of cards you have, and the number of cards you exchange during each operation, respectively.

The next line of each test case contains n n n integers c 1 , c 2 , ... c n c_1, c_2, \ldots c_n c1,c2,...cn ( 1 ≤ c i ≤ 100 1 \le c_i \le 100 1≤ci≤100) --- the numbers written on your cards.

Output

For each test case, output a single integer --- the minimum number of cards you can have left in your hand after any number of operations.

Example

Example

input
7
5 3
4 1 1 4 4
1 10
7
7 2
4 2 1 100 5 2 3
10 4
1 1 1 1 1 1 1 1 1 1
5 2
3 8 1 48 7
6 2
10 20 30 10 20 40
6 3
10 20 30 10 20 40
output
2
1
1
3
5
1
6

Note

The first example case corresponds to the picture above. The sequence of operations displayed there is optimal, so the answer is 2 2 2.

In the second example case, no operations can be performed, so the answer is 1 1 1.

In the fourth example case, you can repeatedly select 4 4 4 cards numbered with 1 1 1 and replace them with 3 3 3 cards numbered with 1 1 1, until there are 3 3 3 cards left.

Solution

具体见文后视频。


Code

cpp 复制代码
#include <bits/stdc++.h>
#define fi first
#define se second
#define int long long

using namespace std;

typedef pair<int, int> PII;
typedef long long LL;

const int N = 1e2 + 10;

int cnt[N];

void solve() {
	memset(cnt, 0, sizeof cnt);
	int n, k;
	cin >> n >> k;

	std::vector<int> a(n + 1);
	int mx = 0;
	for (int i = 1; i <= n; i ++)
		cin >> a[i], cnt[a[i]] ++, mx = max(mx, cnt[a[i]]);

	if (mx < k) {
		cout << n << endl;
	} else {
		cout << k - 1 << endl;
	}
}

signed main() {
	cin.tie(0);
	cout.tie(0);
	ios::sync_with_stdio(0);

	int dt;
	
	cin >> dt;

	while (dt --)
		solve();

	return 0;
}

B. Rectangle Filling

Problem Statement

There is an n × m n \times m n×m grid of white and black squares. In one operation, you can select any two squares of the same color, and color all squares in the subrectangle between them that color.

Formally, if you select positions ( x 1 , y 1 ) (x_1, y_1) (x1,y1) and ( x 2 , y 2 ) (x_2, y_2) (x2,y2), both of which are currently the same color c c c, set the color of all ( x , y ) (x, y) (x,y) where min ⁡ ( x 1 , x 2 ) ≤ x ≤ max ⁡ ( x 1 , x 2 ) \min(x_1, x_2) \le x \le \max(x_1, x_2) min(x1,x2)≤x≤max(x1,x2) and min ⁡ ( y 1 , y 2 ) ≤ y ≤ max ⁡ ( y 1 , y 2 ) \min(y_1, y_2) \le y \le \max(y_1, y_2) min(y1,y2)≤y≤max(y1,y2) to c c c.

This diagram shows a sequence of two possible operations on a grid:

Is it possible for all squares in the grid to be the same color, after performing any number of operations (possibly zero)?

Input

The first line of the input contains a single integer t t t ( 1 ≤ t ≤ 1 0 4 1 \le t \le 10^4 1≤t≤104) --- the number of test cases. The description of the test cases follows.

The first line of each test case contains two integers n n n and m m m ( 1 ≤ n , m ≤ 500 1 \le n, m \le 500 1≤n,m≤500) --- the number of rows and columns in the grid, respectively.

Each of the next n n n lines contains m m m characters 'W' and 'B' --- the initial colors of the squares of the grid.

It is guaranteed that the sum of n ⋅ m n\cdot m n⋅m over all test cases does not exceed 3 ⋅ 1 0 5 3\cdot 10^5 3⋅105.

Output

For each test case, print "YES" if it is possible to make all squares in the grid the same color, and "NO" otherwise.

You can output the answer in any case (upper or lower). For example, the strings "yEs", "yes", "Yes", and "YES" will be recognized as positive responses.

Example

Example

input
8
2 1
W
B
6 6
WWWWBW
WBWWWW
BBBWWW
BWWWBB
WWBWBB
BBBWBW
1 1
W
2 2
BB
BB
3 4
BWBW
WBWB
BWBW
4 2
BB
BB
WW
WW
4 4
WWBW
BBWB
WWBB
BBBB
1 5
WBBWB
output
NO
YES
YES
YES
YES
NO
YES
NO

Note

In the first example, it is impossible to ever change the color of any square with an operation, so we output NO.

The second example is the case pictured above. As shown in that diagram, it is possible for all squares to be white after two operations, so we output YES.

In the third and fourth examples, all squares are already the same color, so we output YES.

In the fifth example we can do everything in two operations. First, select positions ( 2 , 1 ) (2, 1) (2,1) and ( 1 , 4 ) (1, 4) (1,4) and color all squares with 1 ≤ x ≤ 2 1 \le x \le 2 1≤x≤2 and 1 ≤ y ≤ 4 1 \le y \le 4 1≤y≤4 to white. Then, select positions ( 2 , 1 ) (2, 1) (2,1) and ( 3 , 4 ) (3, 4) (3,4) and color all squares with 2 ≤ x ≤ 3 2 \le x \le 3 2≤x≤3 and 1 ≤ y ≤ 4 1 \le y \le 4 1≤y≤4 to white. After these two operations all squares are white.

Solution

具体见文后视频。


Code

cpp 复制代码
#include <bits/stdc++.h>
#define fi first
#define se second
#define int long long

using namespace std;

typedef pair<int, int> PII;
typedef long long LL;

const int N = 5e2 + 10;

int n, m;
int g[N][N], s[N][N];

int sum(int x1, int y1, int x2, int y2) {
	return s[x2][y2] - s[x1 - 1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 - 1];
}

void solve() {
	cin >> n >> m;

	char x;
	for (int i = 1; i <= n; i ++)
		for (int j = 1; j <= m; j ++) {
			cin >> x;
			g[i][j] = (x == 'B');
		}
	for (int i = 1; i <= n; i ++)
		for (int j = 1; j <= m; j ++)
			s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + g[i][j];

	int flg = 1;
	for (int i = 1; i <= n; i ++)
		for (int j = 1; j <= m; j ++)
			if (!g[i][j] && ((sum(1, 1, i, j) && sum(i, j, n, m)) || (sum(i, 1, n, j) && sum(1, j, i, m))))
				continue;
			else if (!g[i][j]) {
				flg = 0;
				break;
			}
	if (flg) {
		cout << "YES" << endl;
		return;
	}
	for (int i = 1; i <= n; i ++)
		for (int j = 1; j <= m; j ++)
			s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + (!g[i][j]);

	flg = 1;
	for (int i = 1; i <= n; i ++)
		for (int j = 1; j <= m; j ++)
			if (g[i][j] && ((sum(1, 1, i, j) && sum(i, j, n, m)) || (sum(i, 1, n, j) && sum(1, j, i, m))))
				continue;
			else if (g[i][j]) {
				flg = 0;
				break;
			}
	if (flg) {
		cout << "YES" << endl;
		return;
	}
	cout << "NO" << endl;
}

signed main() {
	cin.tie(0);
	cout.tie(0);
	ios::sync_with_stdio(0);

	int dt;
	
	cin >> dt;

	while (dt --)
		solve();

	return 0;
}

C. Everything Nim

Problem Statement

Alice and Bob are playing a game on n n n piles of stones. On each player's turn, they select a positive integer k k k that is at most the size of the smallest nonempty pile and remove k k k stones from each nonempty pile at once. The first player who is unable to make a move (because all piles are empty) loses.

Given that Alice goes first, who will win the game if both players play optimally?

Input

The first line of the input contains a single integer t t t ( 1 ≤ t ≤ 1 0 4 1 \le t \le 10^4 1≤t≤104) --- the number of test cases. The description of the test cases follows.

The first line of each test case contains a single integer n n n ( 1 ≤ n ≤ 2 ⋅ 1 0 5 1 \le n \le 2\cdot 10^5 1≤n≤2⋅105) --- the number of piles in the game.

The next line of each test case contains n n n integers a 1 , a 2 , ... a n a_1, a_2, \ldots a_n a1,a2,...an ( 1 ≤ a i ≤ 1 0 9 1 \le a_i \le 10^9 1≤ai≤109), where a i a_i ai is the initial number of stones in the i i i-th pile.

It is guaranteed that the sum of n n n over all test cases does not exceed 2 ⋅ 1 0 5 2\cdot 10^5 2⋅105.

Output

For each test case, print a single line with the name of the winner, assuming both players play optimally. If Alice wins, print "Alice", otherwise print "Bob" (without quotes).

Example

input
7
5
3 3 3 3 3
2
1 7
7
1 3 9 7 4 2 100
3
1 2 3
6
2 1 3 4 2 4
8
5 7 2 9 6 3 3 2
1
1000000000
output
Alice
Bob
Alice
Alice
Bob
Alice
Alice

Note

In the first test case, Alice can win by choosing k = 3 k=3 k=3 on her first turn, which will empty all of the piles at once.

In the second test case, Alice must choose k = 1 k=1 k=1 on her first turn since there is a pile of size 1 1 1, so Bob can win on the next turn by choosing k = 6 k=6 k=6.

Solution

具体见文后视频。


Code

cpp 复制代码
#include <bits/stdc++.h>
#define fi first
#define se second
#define int long long

using namespace std;

typedef pair<int, int> PII;
typedef long long LL;

const int N = 2e5 + 10;

int n;
int a[N];

void solve() {
	cin >> n;

	for (int i = 1; i <= n; i ++)
		cin >> a[i];

	sort(a + 1, a + 1 + n);
	n = unique(a + 1, a + 1 + n) - a - 1;

	int cnt = 0;
	for (int i = 1; i <= n; i ++)
		if (a[i] == a[i - 1] + 1)
			cnt ++;
		else
			break;

	if (n - cnt == 0) {
		if (n & 1) cout << "Alice" << endl;
		else cout << "Bob" << endl;
	}
	else if (cnt & 1) {
		cout << "Bob" << endl;
	} else {
		cout << "Alice" << endl;
	}
}

signed main() {
	cin.tie(0);
	cout.tie(0);
	ios::sync_with_stdio(0);

	int dt;
	
	cin >> dt;

	while (dt --)
		solve();

	return 0;
}

D. Missing Subsequence Sum

Problem Statement

You are given two integers n n n and k k k. Find a sequence a a a of non-negative integers of size at most 25 25 25 such that the following conditions hold.

  • There is no subsequence of a a a with a sum of k k k.
  • For all 1 ≤ v ≤ n 1 \le v \le n 1≤v≤n where v ≠ k v \ne k v=k, there is a subsequence of a a a with a sum of v v v.

A sequence b b b is a subsequence of a a a if b b b can be obtained from a a a by the deletion of several (possibly, zero or all) elements, without changing the order of the remaining elements. For example, [ 5 , 2 , 3 ] [5, 2, 3] [5,2,3] is a subsequence of [ 1 , 5 , 7 , 8 , 2 , 4 , 3 ] [1, 5, 7, 8, 2, 4, 3] [1,5,7,8,2,4,3].

It can be shown that under the given constraints, a solution always exists.

Input

The first line of the input contains a single integer t t t ( 1 ≤ t ≤ 1000 1 \le t \le 1000 1≤t≤1000) --- the number of test cases. The description of the test cases follows.

Each test case consists of a single line containing two integers n n n and k k k ( 2 ≤ n ≤ 1 0 6 2 \le n \le 10^6 2≤n≤106, 1 ≤ k ≤ n 1 \le k \le n 1≤k≤n) --- the parameters described above.

It is guaranteed that the sum of n n n over all test cases does not exceed 1 0 7 10^7 107.

Output

The first line of output for each test case should contain a single integer m m m ( 1 ≤ m ≤ 25 1 \le m \le 25 1≤m≤25) --- the size of your chosen sequence.

The second line of output for each test case should contain m m m integers a i a_i ai ( 0 ≤ a i ≤ 1 0 9 0 \le a_i \le 10^9 0≤ai≤109) --- the elements of your chosen sequence.

If there are multiple solutions, print any.

Example

Example

input
5
2 2
6 1
8 8
9 3
10 7
output
1
1
5
2 3 4 5 6
7
1 1 1 1 1 1 1
4
7 1 4 1
4
1 2 8 3

Note

In the first example, we just need a subsequence that adds up to 1 1 1, but not one that adds up to 2 2 2. So the array a = [ 1 ] a=[1] a=[1] suffices.

In the second example, all elements are greater than k = 1 k=1 k=1, so no subsequence adds up to 1 1 1. Every other integer between 1 1 1 and n n n is present in the array, so there is a subsequence of size 1 1 1 adding up to each of those numbers.

Solution

具体见文后视频。

Code

cpp 复制代码
#include <bits/stdc++.h>
#define fi first
#define se second
#define int long long

using namespace std;

typedef pair<int, int> PII;
typedef long long LL;

const int N = 1e6 + 10;

int n, k;
int f[N];

void solve() {
	cin >> n >> k;

	f[0] = 1;
	std::vector<int> res;
	int i;
	for (i = 1; i * 2 - 1 < k; i *= 2) {
		res.emplace_back(i);
		for (int j = n; j >= i; j --)
			f[j] |= f[j - i];
	}
	if (k - i > 0) {
		res.emplace_back(k - i);
		for (int j = n; j >= k - i; j --)
			f[j] |= f[j - (k - i)];
	}

	for (i = k + 1; i <= n; i ++)
		if (!f[i]) {
			res.emplace_back(i);
			for (int j = n; j >= i; j --)
				f[j] |= f[j - i];
		}

	cout << res.size() << endl;
	for (auto v : res)
		cout << v << " ";
	cout << endl;
	for (int i = 0; i <= n; i ++)
		f[i] = 0;
}

signed main() {
	cin.tie(0);
	cout.tie(0);
	ios::sync_with_stdio(0);

	int dt;
	
	cin >> dt;

	while (dt --)
		solve();

	return 0;
}

E. Folding Strip

Problem Statement

You have a strip of paper with a binary string s s s of length n n n. You can fold the paper in between any pair of adjacent digits.

A set of folds is considered valid if after the folds, all characters that are on top of or below each other match. Note that all folds are made at the same time, so the characters don't have to match in between folds.

For example, these are valid foldings of s = 110110110011 s = \mathtt{110110110011} s=110110110011 and s = 01110 s = \mathtt{01110} s=01110:

The length of the folded strip is the length seen from above after all folds are made. So for the two above examples, after the folds shown above, the lengths would be 7 7 7 and 3 3 3, respectively.

Notice that for the above folding of s = 01110 s = \mathtt{01110} s=01110, if we made either of the two folds on their own, that would not be a valid folding. However, because we don't check for validity until all folds are made, this folding is valid.

After performing a set of valid folds, what is the minimum length strip you can form?

Input

The first line of the input contains a single integer t t t ( 1 ≤ t ≤ 1 0 4 1 \le t \le 10^4 1≤t≤104) --- the number of test cases. The description of the test cases follows.

The first line of each test case contains a single integer n n n ( 1 ≤ n ≤ 2 ⋅ 1 0 5 1 \le n \le 2\cdot 10^5 1≤n≤2⋅105) --- the size of the strip.

The second line of each test case contains a string s s s of n n n characters '0' and '1' --- a description of the digits on the strip.

It is guaranteed that the sum of n n n over all test cases does not exceed 2 ⋅ 1 0 5 2\cdot 10^5 2⋅105.

Output

For each test case, output a single integer --- the minimum possible length of the strip after a valid folding.

Example

input
6
6
101101
1
0
12
110110110011
5
01110
4
1111
2
01
output
3
1
3
3
1
2

Note

For the first example case, one optimal folding is to fold the strip in the middle, which produces a strip of length 3.

The third and fourth example cases correspond to the images above. Note that the folding shown above for s = 110110110011 s = \mathtt{110110110011} s=110110110011 is not of minimal length.

Solution

具体见文后视频。


Code

cpp 复制代码
#include <bits/stdc++.h>
#define fi first
#define se second
#define int long long

using namespace std;

typedef pair<int, int> PII;
typedef long long LL;

void solve() {
	int n;
	string s;

	cin >> n >> s, s = ' ' + s;

	int mn = 0, mx = 0, cur = 0;
	for (int i = 1; i <= n; i ++) {
		if ((cur & 1) == (s[i] == '1'))
			cur ++;
		else
			cur --;
		mn = min(mn, cur), mx = max(mx, cur);
	}

	cout << mx - mn << endl;
}

signed main() {
	cin.tie(0);
	cout.tie(0);
	ios::sync_with_stdio(0);

	int dt;
	
	cin >> dt;

	while (dt --)
		solve();

	return 0;
}

视频讲解

Codeforces Round 941 (Div. 2)(A ~ E 题讲解)


最后祝大家早日

相关推荐
xiaoshiguang32 小时前
LeetCode:222.完全二叉树节点的数量
算法·leetcode
爱吃西瓜的小菜鸡2 小时前
【C语言】判断回文
c语言·学习·算法
别NULL2 小时前
机试题——疯长的草
数据结构·c++·算法
TT哇2 小时前
*【每日一题 提高题】[蓝桥杯 2022 国 A] 选素数
java·算法·蓝桥杯
CYBEREXP20083 小时前
MacOS M3源代码编译Qt6.8.1
c++·qt·macos
yuanbenshidiaos4 小时前
c++------------------函数
开发语言·c++
yuanbenshidiaos4 小时前
C++----------函数的调用机制
java·c++·算法
唐叔在学习4 小时前
【唐叔学算法】第21天:超越比较-计数排序、桶排序与基数排序的Java实践及性能剖析
数据结构·算法·排序算法
ALISHENGYA4 小时前
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(switch语句)
数据结构·算法
tianmu_sama4 小时前
[Effective C++]条款38-39 复合和private继承
开发语言·c++