Codeforces Round 1116 (Div. 2)

A

下界始终是三个数中的最小值,上界要么是最大值,要么是除最大值外的两个数之和

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define endl "\n"
// #define int long long
const int mod = 998244353;
const int maxn = 2e5 + 5;
int a[maxn];
void Solve() {
for (int i = 1; i <= 3; i++) cin >> a[i];
sort(a + 1, a + 1 + 3);
cout << min(a[3] - a[1], a[2]) << endl;
}
signed main() {
// freopen("a.in", "r", stdin);
// freopen("a.out", "w", stdout);
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int T;
cin >> T;
while (T--) {
Solve();
}
return 0;
}

B

观察发现合法串一定是 00001111 交替。因此只需要枚举四种开头 01100110, 00110011, 11001100, 10011001

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define endl "\n"
// #define int long long
const int mod = 998244353;
const int maxn = 2e5 + 5;
int n;
string s;
void Solve() {
cin >> n >> s;
int ans = 0;
++ans;
for (int i = 0; i < n; i++) {
if ((i % 4 == 0 || i % 4 == 1)) {
if (s[i] == '1') {
--ans; break;
}
} else {
if (s[i] == '0') {
--ans; break;
}
}
}
++ans;
for (int i = 0; i < n; i++) {
if (i % 4 == 0 || i % 4 == 3) {
if (s[i] == '1') {
--ans; break;
}
} else {
if (s[i] == '0') {
--ans; break;
}
}
}
++ans;
for (int i = 0; i < n; i++) {
if (i % 4 == 2 || i % 4 == 3) {
if (s[i] == '1') {
--ans; break;
}
} else {
if (s[i] == '0') {
--ans; break;
}
}
}
++ans;
for (int i = 0; i < n; i++) {
if (i % 4 ==1 || i % 4 == 2) {
if (s[i] == '1') {
--ans; break;
}
} else {
if (s[i] == '0') {
--ans; break;
}
}
}
cout << ans << endl;
}
signed main() {
// freopen("b.in", "r", stdin);
// freopen("b.out", "w", stdout);
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int T;
cin >> T;
while (T--) {
Solve();
}
return 0;
}

C

显然,初始有土豆的人 应该在最后一轮的时候,将土豆传递给下一个人,这样就能保证自己手上的土豆最后一定落在对方手上。注意判断下一个人也有土豆的情况就行了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define endl "\n"
// #define int long long
const int mod = 998244353;
const int maxn = 2e5 + 5;
int n, k;
string s;
void Solve() {
cin >> n >> k;
cin >> s;
int ans[2] = {0};
for (int i = 0; i < n * 2; i++) {
if (s[i] == '0') continue;
if (s[(i + 1) % (n * 2)] == '1') ++ans[!(i % 2)];
else ++ans[i % 2];
}
cout << ans[0] << " " << ans[1] << endl;
}
signed main() {
// freopen("c.in", "r", stdin);
// freopen("c.out", "w", stdout);
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int T;
cin >> T;
while (T--) {
Solve();
}
return 0;
}

D

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define endl "\n"
#define int long long
const int mod = 998244353;
const int maxn = 1e6 + 5;
int frac[maxn];
int qpow(int a, int n) {
int res = 1;
while (n) {
if (n & 1) res = 1ll * res * a % mod;
a = 1ll * a * a % mod;
n /= 2;
}
return res;
}
int C(int n, int m) {
if (m < 0 || m > n || n < 0) return 0;
return 1ll * frac[n] * qpow(1ll * frac[m] * frac[n - m] % mod, mod - 2) % mod;
}
int n;
string s;
void Solve() {
cin >> n;
cin >> s;
int k = 0, t = 0;
for (int i = 1; i < n; i++) {
if (s[i - 1] != s[i]) {
++k;
if (k & 1) t += i;
else t -= i;
}
}
if (k == 0) {
cout << 1 << endl;
return;
} else if (k & 1) {
cout << C(t - 1, k / 2) * C(n - 1 - t, k / 2) % mod << endl;
} else {
cout << C(-t - 1, k / 2 - 1) * C(n - 1 + t, k / 2) % mod << endl;
}
}
signed main() {
// freopen("d.in", "r", stdin);
// freopen("d.out", "w", stdout);
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int T;
cin >> T;
frac[0] = 1;
for (int i = 1; i < maxn; i++) frac[i] = 1ll * frac[i - 1] * i % mod;
while (T--) {
Solve();
}
return 0;
}

F

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define endl "\n"
#define int long long
const int mod = 998244353;
const int maxn = 2e5 + 5;
int n;
int a[maxn];
bool check(int k) {
priority_queue<int> q;
for (int i = 1; i <= n; i++) q.push(a[i]);
for (int i = 0; i < max(0ll, k - 30); i++) {
q.pop(); q.push(0);
}
for (int i = min(k - 1, 29ll); i >= 0; i--) {
int x = q.top();
q.pop();
x = max(0ll, x - (1ll << i));
q.push(x);
}
return q.top() == 0;
}
void Solve() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
int l = 0, r = n + 30, ans = -1;
while (l <= r) {
int mid = (l + r) / 2;
if (check(mid)) {
r = mid - 1;
ans = mid;
} else {
l = mid + 1;
}
}
cout << ans << endl;
}
signed main() {
// freopen("f.in", "r", stdin);
// freopen("f.out", "w", stdout);
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int T;
cin >> T;
while (T--) {
Solve();
}
return 0;
}