1968(div3)
A. Maximize?
给你一个整数
直接模拟即可。
void solve() {
int n;cin >> n;
int ans = -1, ret = -1;
for (int i = 1;i < n;i++) {
int x = __gcd(n, i) + i;
if (x > ans) {
ans = x;
ret = i;
}
}
cout << ret << '\n';
}
B. Prefiquence
给您两个二进制字符串
您的任务是确定最大可能的数字
双指针
void solve() {
int n, m;cin >> n >> m;string a, b;cin >> a >> b;
int j = 0, cnt = 0;
for (int i = 0;i < m;i++) {
if (b[i] == a[j]) {
cnt++;j++;
}
}
cout << cnt << '\n';
}
C. Assembly via Remainders
给你一个数组
代表所有的 . 代表所有的 。
构造
void solve() {
int n;cin >> n;vector<int> x(n + 1), a(n + 1);
for (int i = 2;i <= n;i++)cin >> x[i];
a[1] = x[2] + 1;
for (int i = 2;i <= n;i++) {
a[i] = x[i];
while (i != n && a[i] <= x[i + 1]) {
a[i] += a[i - 1];
}
}
for (int i = 1;i <= n;i++)cout << a[i] << " \n"[i == n];
}
D. Permutation Game
Bodya 和 Sasha 发现了一个排列
它们都选择了排列的起始位置。
对局持续了
- 如果棋手当前的位置是
,他的得分就会增加 。 - 然后棋手要么停留在当前位置
,要么从 移动到 。
在整整
知道了博迪娅的起始位置
Solution
分别单独计算
#define int long long
void solve() {
int n, k, b, s;cin >> n >> k >> b >> s;vector<int> p(n + 1), a(n + 1);
for (int i = 1;i <= n;i++)cin >> p[i];
for (int i = 1;i <= n;i++)cin >> a[i];
auto cal = [&](int x) {
int r = 0, cur = 0;
for (int i = 0;i < k && i <= n + 1;i++) {
r = max(r, cur + (k - i) * a[x]);
cur += a[x];
x = p[x];
}
return r;
};
int x = cal(b);
int y = cal(s);
if (x == y) {
cout << "Draw\n";
} else if (x > y) {
cout << "Bodya\n";
} else {
cout << "Sasha\n";
}
}
E. Cells Arrangement
给你一个整数
假设
Solution
构造
当
void solve() {
int n;cin >> n;
if (n == 2) {
cout << "1 1\n1 2\n";return;
}
if (n == 3) {
cout << "2 1\n2 3\n 3 1\n";return;
}
cout << "1 1\n1 2\n4 2\n4 4\n";
for (int i = 5;i <= n;i++)cout << i << ' ' << i << '\n';
}
这里当
当
每次在对角线上添加一个时,每个数字都可以增加 2,即
F. Equal XOR Segments
如果可以将一个数组分成个数组,我们就称它为
k>1 个部分,使得每个部分的值的 bitwise XOR 都相等,那么这个数组就是有趣的数组。
更正式地说,你必须把数组
例如,如果是
给你一个数组
- 对于固定的
, ,判断子数组 是否有趣。
Solution
位运算
有
在本题中,若有三个以上的区间异或和是相等的,则这三个区间可以合并成一个区间,且异或和与之前一样。
由于本题要求
当
当
要使得满足这个条件,就得让得到的
这里我记反了,
lower_bound
是第一个大于等于的元素,uppper_bound
是第一个大于的元素
void solve() {
int n, q;cin >> n >> q;vector<int> a(n + 1), s(n + 1);
map<int, vector<int>>mp;
mp[0].push_back(0);
for (int i = 1;i <= n;i++) {
cin >> a[i];s[i] = s[i - 1] ^ a[i];
mp[s[i]].push_back(i);
}
while (q--) {
int l, r;cin >> l >> r;
if (s[r] == s[l - 1]) {
cout << "Yes\n";
} else {
auto t = *lower_bound(mp[s[r]].begin(), mp[s[r]].end(), l);
auto m = *--lower_bound(mp[s[l - 1]].begin(), mp[s[l - 1]].end(), r);
if (t < m) {
cout << "Yes\n";
} else {
cout << "No\n";
}
}
}
cout << '\n';
}
G. Division + LCP
给你一个字符串
例如,如果
您的任务是找出
easy
:hard
:
Solution
Z 算法(扩展 KMP 算法)+二分/字符串算法/LCP
字符串算法我觉得可以放一下
(待更