VP Codeforces Round 906 (Div. 2)
A. Doremy's Paint 3
题意:给你你个数组,你要重排它使得每两个相邻数的和都相同。
点击查看代码
void solve() {
int n;
std::cin >> n;
std::vector<int> a(n);
std::set<int> s;
for (int i = 0; i < n; ++ i) {
std::cin >> a[i];
s.insert(a[i]);
}
int cnt = 0;
for (int i = 0; i < n; ++ i) {
cnt += a[i] == a[0];
}
if ((s.size() == 2 && (cnt == n / 2 || cnt == (n + 1) / 2)) || s.size() == 1) {
std::cout << "YES\n";
} else {
std::cout << "NO\n";
}
}
B. Qingshan Loves Strings
题意:给你两个
如果
点击查看代码
void solve() {
int n, m;
std::cin >> n >> m;
std::string s, t;
std::cin >> s >> t;
bool flag = true;
for (int i = 1; i < n; ++ i) {
flag &= s[i] != s[i - 1];
}
if (flag) {
std::cout << "YES\n";
return;
}
flag = true;
for (int i = 1; i < m; ++ i) {
flag &= t[i] != t[i - 1];
}
if (flag) {
for (int i = 1; i < n; ++ i) {
if (s[i] == s[i - 1]) {
if (s[i - 1] == t[0] || s[i] == t.back()) {
std::cout << "NO\n";
return;
}
}
}
std::cout << "YES\n";
return;
}
std::cout << "NO\n";
}
C. Qingshan Loves Strings 2
题意:给你一个
首先每次插入都会使得
假设
点击查看代码
void solve() {
int n;
std::cin >> n;
std::string s;
std::cin >> s;
int cnt[2]{};
for (auto & c : s) {
++ cnt[c - '0'];
}
if (cnt[0] != cnt[1]) {
std::cout << -1 << "\n";
return;
}
std::vector<int> ans;
auto insert = [&](int p) -> void {
ans.push_back(p);
s = s.substr(0, p + 1) + "01" + s.substr(p + 1);
};
for (int l = 0, r = n - 1; l < r; ++ l, -- r) {
if (s[l] == s[r]) {
if (s[l] == '0') {
insert(r);
r += 2;
} else {
insert(l - 1);
r += 2;
}
}
}
std::cout << ans.size() << "\n";
for (auto & p : ans) {
std::cout << p + 1 << " \n"[p == ans.back()];
}
}
D. Doremy's Connecting Plan
题意:一开始有
我们一定是选两个集合最小的两个位置操作,因为这样
那么我们现在改一下式子:
点击查看代码
void solve() {
int n;
i64 c;
std::cin >> n >> c;
std::vector<std::array<i64, 3>> a(n + 1);
for (int i = 1; i <= n; ++ i) {
i64 x;
std::cin >> x;
a[i] = {i * c - x, x, i};
}
std::sort(a.begin() + 2, a.end());
i64 sum = a[1][1];
for (int i = 2; i <= n; ++ i) {
if (sum < a[i][0]) {
std::cout << "NO\n";
return;
}
sum += a[i][1];
}
std::cout << "YES\n";
}
E1. Doremy's Drying Plan (Easy Version)
题意:有
分成两种情况:
- 两个线段不相交
- 两个线段相交
我们先利用差分算出每个点被多少线段覆盖。
对于第一种情况,我们记录线段覆盖的区间中只被
对于第二种情况,我们用优先队列存每个线段的右端点和左端点,先把线段存在数组里按左端点排序,然后从小到大枚举,对于每个左端点为
点击查看代码
void solve() {
int n, m, k;
std::cin >> n >> m >> k;
using PII = std::pair<int, int>;
std::vector<PII> segs;
std::vector<int> d(n + 2);
for (int i = 0; i < m; ++ i) {
int l, r;
std::cin >> l >> r;
segs.push_back({l, r});
d[l] += 1;
d[r + 1] -= 1;
}
std::vector<int> one(n + 1), two(n + 1);
int ans = 0;
for (int i = 1; i <= n; ++ i) {
d[i] += d[i - 1];
one[i] = one[i - 1];
two[i] = two[i - 1];
if (d[i] == 0) {
++ ans;
} else if (d[i] == 1) {
++ one[i];
} else if (d[i] == 2) {
++ two[i];
}
}
int max1 = 0, max2 = 0;
for (auto & [l, r] : segs) {
int cnt = one[r] - one[l - 1];
if (cnt >= max1) {
max2 = max1;
max1 = cnt;
} else if (cnt > max2) {
max2 = cnt;
}
}
int ans1 = max1 + max2;
std::sort(segs.begin(), segs.end());
std::priority_queue<PII, std::vector<PII>, std::greater<>> heap;
for (int i = 1, t = 0; i <= n; ++ i) {
while (heap.size() && heap.top().first < i) {
heap.pop();
}
while (t < m && segs[t].first == i) {
heap.push({segs[t].second, segs[t].first});
++ t;
}
if (heap.size() == 2) {
auto [a1, a2] = heap.top(); heap.pop();
auto [a3, a4] = heap.top();
std::vector<int> a{a1, a2, a3, a4};
std::sort(a.begin(), a.end());
int cnt = one[a[3]] - one[a[0] - 1] + two[a[2]] - two[a[1] - 1];
ans1 = std::max(ans1, cnt);
heap.push({a1, a2});
}
}
std::cout << ans + ans1 << "\n";
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!