Codeforces Round 1011 (Div. 2) A-E 题解
Codeforces Round 1011 (Div. 2)
A - Serval and String Theory
Code
#include <bits/stdc++.h>
using namespace std;
int main() {
// freopen ("A.out", "w", stdout);
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int T; cin >> T;
while (T--) {
int N, K; cin >> N >> K;
string S; cin >> S;
map<char, int> mp;
for (int i = 0; i < N; i++)
mp[S[i]]++;
if (mp.size() == 1) {
cout << "NO\n";
continue;
}
if (K == 0) {
string S_ = S;
reverse(S_.begin(), S_.end());
if (S < S_) cout << "YES\n";
else cout << "NO\n";
}
else {
cout << "YES\n";
}
}
return 0;
}
B - Serval and Final
Question
给定一个数组
选择两个数
要求最后一个元素为
Solution
我的解法比较麻烦
- 如果全
的话,分成两半处理即可 - 如果全非
,那么 即可
对于有
我们发现
每次从头找,如果发现一个
每次都从头处理,每次模拟
Code
#include <bits/stdc++.h>
using namespace std;
void solve() {
int N; cin >> N;
vector<int> A(N + 1);
for (int i = 1; i <= N; i++) cin >> A[i];
map<int, int> mp;
auto Mex = [&] (vector<int> &A) {
mp.clear();
for (int i = 0; i < A.size(); i++)
mp[A[i]] += 1;
for (int i = 0; i > -1 ; i++)
if (mp[i] == 0) return i;
return 0;
};
vector<pair<int, int>> ans;
auto print = [&] () {
assert(N == 1 and A[1] == 0);
cout << ans.size() << '\n';
for (auto [x, y] : ans) cout << x << ' ' << y << '\n';
};
auto check = [&] (int l, int r) {
ans.push_back({l, r});
vector<int> b;
for (int i = l; i <= r; i++)
b.push_back(A[i]);
int m = Mex(b);
A[l] = m;
for (int i = l + 1; i + 1 <= N; i++)
A[i] = A[i + 1];
for (int i = N - (r - l) + 1; i <= N; i++)
A[i] = 0;
N -= (r - l);
};
if (*max_element(A.begin(), A.end()) == 0) {
check(1, 2);
check(2, N);
check(1, N);
print();
return;
}
while (N >= 2) {
int flg = 0;
for (int i = 1; i <= N; i++) {
if (A[i] == 0) {
if (i != N) {
check(i, i + 1);
flg = 1;
break;
}
else {
check(i - 1, i);
flg = 1;
break;
}
}
}
if (!flg)
check(1, N);
}
print();
}
int main() {
freopen ("B.out", "w", stdout);
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int T; cin >> T;
while (T--) solve();
}
C - Serval and The Formula
Question
给定
Solution
异或是二进制下不进位的加法,所以
显然
由于
而
Code
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
void solve() {
ll x, y; cin >> x >> y;
if (x == y) {
cout << -1 << '\n';
return;
}
ll k = (1ll << 50) - max(x, y);
cout << k << '\n';
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int T; cin >> T;
while (T--) solve();
}
D - Serval and Kaitenzushi Buffet
Question
有一个传送带,上有
第
初始时寿司片计数器
- 取下第
盘寿司,收益加 , 加 - 吃掉一片
- 什么都不做,
不变
要求在
Solution
先思考一个问题,其实第
由于
我们假象在第
一种不是最优但是可行的方法是在
根据之前的结论,在第
所以从头往后处理,当遇到一个标记时,找之前的价值最大的盘子取下,这个可以用一个堆实现
Code
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
void solve() {
int n, k; cin >> n >> k;
vector<int> a(n + 1);
for (int i = 1; i <= n; i++) cin >> a[i];
vector<int> vis(n + 1, 0);
for (int i = n - k; i >= 1; i -= k + 1) vis[i] = 1;
priority_queue<int> pq;
ll ans = 0;
for (int i = 1; i <= n; i++) {
pq.push(a[i]);
if (vis[i]) {
ans += pq.top();
// cout << i << " " << pq.top() << '\n';
pq.pop();
}
}
cout << ans << '\n';
}
int main() {
freopen ("D.out", "w", stdout);
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int T; cin >> T;
while (T--) solve();
return 0;
}
E - Serval and Modulo
Question
已知长度为
需要你求出
Solution
大体想法肯定是枚举
所以我们只需要枚举
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int vis[1000005];
constexpr int INF = 1e9;
void solve() {
int n; cin >> n;
vector<int> a(n + 1), b(n + 1);
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= n; i++) cin >> b[i];
sort(a.begin() + 1, a.end());
sort(b.begin() + 1, b.end());
ll sum = 0;
for (int i = 1; i <= n; i++) sum += a[i] - b[i];
if (sum == 0) {
if (a == b) {
cout << INF << '\n';
return;
}
else {
cout << -1 << '\n';
return;
}
}
vector<ll> factors;
for (ll i = 1; i * i <= sum; i++) {
if (sum % i == 0) {
factors.push_back(i);
if (i * i != sum) factors.push_back(sum / i);
}
}
auto check = [&] (ll k) {
// cout << k << '
for (int i = 1; i <= n; i++) vis[a[i] % k] += 1;
for (int i = 1; i <= n; i++) vis[b[i]] -= 1;
int flg = 1;
for (int i = 1; i <= n; i++) {
if (vis[a[i] % k] != 0 or vis[b[i]] != 0) {
flg = 0;
break;
}
}
for (int i = 1; i <= n; i++) vis[a[i] % k] = 0, vis[b[i]] = 0;
return flg;
};
for (ll &k : factors) {
if (check(k)) {
cout << k << '\n';
return;
}
}
cout << -1 << '\n';
}
int main() {
// freopen ("E.out", "w", stdout);
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int T; cin >> T;
while (T--) solve();
return 0;
}