1935(div2)
A. Entertainment in MAC
给你一个字符串
- 将反向字符串
添加到字符串 的末尾 - 将当前字符串
倒转
需要确定在进行精确的
void solve() {
int n;cin >> n;string s;cin >> s;
for (int i = 0;i < s.size() / 2;i++) {
if (s[i] < s[s.size() - 1 - i]) {
cout << s << '\n';return;
} else if (s[i] == s[s.size() - 1 - i]) {
continue;
} else {
string ss = s;
reverse(s.begin(), s.end());
cout << s << ss << '\n';return;
}
}
cout << s << '\n';
}
或·:
std::cout << std::min(s, s + ss) << "\n";
B. Informatics in MAC
有一个长度为
请帮助 Nyam-Nyam 找到合适的除法,若无解,则输出-1
数组中的
900 ms 卡着过的
void solve() {
int n;cin >> n;vector<int> a(n + 1), num(n + 1);
for (int i = 1;i <= n;i++) {
cin >> a[i];num[a[i]]++;
}
int m = 0;bool ok = false;
for (int i = 0;i < n;i++) {
if (!num[i]) {
ok = true;
m = i;break;
}
}
if (!ok) {
cout << "-1\n";return;
}
//在前面一部分找到0-(m-1)即可
int end = 0;
vector<int> p(n + 1, 0);
for (int i = 1;i <= n;i++) {
p[a[i]]++;
bool ok = true;
for (int j = 0;j < m;j++) {
if (!p[j]) {
ok = false;
break;
}
}
if (ok) {
end = i;break;
}
}
vector<int> p1(n + 1, 0);
if (end) {
for (int i = end + 1;i <= n;i++) {
p1[a[i]]++;
}
for (int j = 0;j < m;j++) {
if (!p1[j]) {
cout << "-1\n";return;
}
}
cout << "2\n1 " << end << "\n" << end + 1 << " " << n << "\n";return;
}
cout << "-1\n";
}
应该对前缀和后缀进行预处理,看是否满足前面部分和后面部分都含有
void solve() {
int n;cin >> n;vector<int> a(n + 1), pre(n + 1), suf(n + 1), cnt(n + 1);
for (int i = 1;i <= n;i++)cin >> a[i];
int x = 0;
for (int i = 1;i <= n;i++) {
cnt[a[i]]++;
while (cnt[x]) {
x++;
}
pre[i] = x;
}
x = 0;
cnt.assign(n, 0);
for (int i = n;i >= 1;i--) {
cnt[a[i]]++;
while (cnt[x]) {
x++;
}
suf[i] = x;
}
for (int i = 1;i < n;i++) {
if (pre[i] == suf[i + 1]) {
cout << "2\n1 " << i << "\n" << i + 1 << " " << n << "\n";return;
}
}
cout << "-1\n";
}
C. Messenger in MAC
从 0
Solution
贪心/DP
void solve() {
int n, l;cin >> n >> l;
vector<pair<int, int>> a(n);
for (int i = 0;i < n;i++) {
cin >> a[i].first >> a[i].second;
}
sort(a.begin(), a.end(), [&](auto x, auto y) {
return x.second < y.second;
});
int ans = 0;
for (int i = 0;i < n;i++) {
multiset <int> s;
int curr = 0;
for (int j = i;j < n;j++) {
s.insert(a[j].first);curr += a[j].first;
while (s.size() && a[j].second - a[i].second + curr > l) {
int maxa = *s.rbegin();
curr -= maxa;
// s.extract(maxa);
if (s.find(maxa) != s.end()) {//和上面的函数等价
s.erase(s.find(maxa));
}
}
ans = max(ans, (int)s.size());
}
}
cout << ans << '\n';
}
DP (待更
D. Exam in MAC
给出一个长度为
Solution
容斥原理/组合数学
主要是要往这个方面想,想到了就很简单了。
官方题解:
用容斥原理:
#define int long long
void solve() {
int n, c;cin >> n >> c;
vector<int> a(n);
for (int i = 0;i < n;i++) {
cin >> a[i];
}
int cnt = (c + 2) * (c + 1) / 2, odd = 0;
for (int i = 0;i < n;i++) {
cnt -= a[i] / 2 + 1;
cnt -= c - a[i] + 1;
if (a[i] % 2)odd++;
}
int even = n - odd;
cnt += (odd + 1) * odd / 2 + (even + 1) * even / 2;
cout << cnt << '\n';
}
E. Distance Learning Courses in MAC
总共有
第
远程学习课程的创建者决定以一种特殊的方式确定最终成绩。假设第
输出
Solution
线段树/位运算
让我们解决当
- 这个比特不能包含在答案中 - 这个比特将包含在答案中,我们加上它 - 一种特殊情况,因为对于一个比特出现在其中的数字,我们可以设置它,并对于另一个数字,我们可以设置所有比特 。
因此,如果我们遇到一些比特
因此,对于请求
- 对于所有
,取所有 的按位或,记为数字 - 迭代比特
并类似于 的情况考虑相同的情况,但是对于数组 。同时,考虑比特出现在 中。
这种解决方案可以使用每个比特的前缀和在
没看懂(待更