Codeforces Global Round 23 A-D
A
题解
知识点:贪心,构造。
注意到有 \(1\) 就一定能构造。
时间复杂度 \(O(n)\)
空间复杂度 \(O(1)\)
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
bool solve() {
int n, k;
cin >> n >> k;
bool ok = 0;
for (int i = 1;i <= n;i++) {
int x;
cin >> x;
ok |= x;
}
if (ok) cout << "YES" << '\n';
else cout << "NO" << '\n';
return true;
}
int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t = 1;
cin >> t;
while (t--) {
if (!solve()) cout << -1 << '\n';
}
return 0;
}
B
题解
知识点:枚举,双指针。
用对撞指针,枚举左侧 \(1\) 和 右侧 \(0\) ,一次操作能消除一对。
时间复杂度 \(O(n)\)
空间复杂度 \(O(n)\)
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int a[100007];
bool solve() {
int n;
cin >> n;
for (int i = 1;i <= n;i++) cin >> a[i];
int l = 1, r = n;
int cnt = 0;
while (l <= r) {
while (l <= r && a[l] == 0)l++;
while (l <= r && a[r] == 1)r--;
if (l <= r) {
l++;
r--;
cnt++;
}
}
cout << cnt << '\n';
return true;
}
int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t = 1;
cin >> t;
while (t--) {
if (!solve()) cout << -1 << '\n';
}
return 0;
}
C
题解
知识点:枚举。
容易发现,我们可以通过操作将序列变成非减序列,只要我们从左到右操作每组 \(a_i<a_{i-1}\) 的 \(a_i\) ,使 \(a_i \geq a_{i-1}\) 。这样的相邻数对之差大于 \(i\) 的不会超过 \(n-i\) 组,即第 \(i\) 次操作修改的一定小于等于 \(i\) ,因此我们一定可以通过 \(n\) 次操作修改所有这样的数对。
把所有相邻两数的差带着下标从小到大排序输出下标就行。
时间复杂度 \(O(n \log n)\)
空间复杂度 \(O(n)\)
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int a[100007];
bool solve() {
int n;
cin >> n;
for (int i = 1;i <= n;i++) cin >> a[i];
vector<pair<int, int>> v;
v.push_back({ 0,1 });
for (int i = 2;i <= n;i++) {
v.push_back({ a[i - 1] - a[i], i });
}
sort(v.begin(), v.end());
for (auto [i, j] : v) cout << j << ' ';
cout << '\n';
return true;
}
int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t = 1;
cin >> t;
while (t--) {
if (!solve()) cout << -1 << '\n';
}
return 0;
}
D
题解
知识点:树形dp,贪心。
此题重点在于如何分配路径到子节点。
显然,为了保证子节点路径数至多相差 \(1\) ,若父节点有 \(p\) 或 \(p+1\) 条路径,那么 \(s\) 个子节点可能的路径数只有 \(\lfloor \frac{p}{s} \rfloor\) 或 \(\lfloor \frac{p}{s} \rfloor + 1\) 。
- \(s>2\) 和 \(s=1\) 时,显然成立。
- \(s = 2\) 时, \(p\) 能被整除时显然成立。
- \(s = 2\) 时, \(p\) 不能被整除时 \(p+1\) 一定能被整除,但只有 \(\lfloor \frac{p}{s} \rfloor + 1\) 一种合法情况,\(p\) 有 \(\lfloor \frac{p}{s} \rfloor\) 或 \(\lfloor \frac{p}{s} \rfloor + 1\) 两种,同样成立。
我们知道了子节点可能分配到路径后,对分配方法进行dp就行。
设 \(f[u][0/1]\) ,表示对于节点 \(u\) 的子树, \(u\) 具有路径数为 \(p\) 或 \(p+1\) 时,子树的总贡献。对于 \(f[u][0/1]\) ,先加上 \(u\) 本身的贡献,以及子节点 \(v\) 路径数为 \(\lfloor \frac{p}{s} \rfloor\) 的一种贡献,即 \(f[v][0]\) ,这是子节点都能分配到的。
然后,对于 \(f[u][0]\) ,可以给 \(p \mod s\) 个子节点多分配一条路径;对于 \(f[u][1]\) 可以给 \((p+1) \mod s\) 个子节点多分配一条路径。这些子节点的贡献可以加一个增量 \(f[v][1]-f[v][0]\) ,我们按照这个增量排序,就能找到增量最大的几个子节点,我们给它们分配即可。
最后输出 \(f[1][0]\) ,根节点没有多一条路径的选择。
时间复杂度 \(O(n \log n)\)
空间复杂度 \(O(n)\)
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
vector<int> g[200007];
int s[200007];
ll f[200007][2];
void dfs(int u, int p) {
f[u][0] = 1LL * p * s[u];
f[u][1] = f[u][0] + s[u];
if (!g[u].size()) return;
vector<ll> tb;
for (auto v : g[u]) {
dfs(v, p / g[u].size());
f[u][0] += f[v][0];
f[u][1] += f[v][0];
tb.push_back(f[v][1] - f[v][0]);
}
sort(tb.begin(), tb.end(), [&](ll a, ll b) {return a > b;});
int r = p % g[u].size();
for (int i = 0;i < r;i++) f[u][0] += tb[i];
for (int i = 0;i <= r;i++) f[u][1] += tb[i];
}
bool solve() {
int n, k;
cin >> n >> k;
for (int i = 1;i <= n;i++) g[i].clear();
for (int i = 2;i <= n;i++) {
int p;
cin >> p;
g[p].push_back(i);
}
for (int i = 1;i <= n;i++) cin >> s[i];
dfs(1, k);
cout << f[1][0] << '\n';
return true;
}
int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t = 1;
cin >> t;
while (t--) {
if (!solve()) cout << -1 << '\n';
}
return 0;
}
Codeforces Global Round 23 A-D的更多相关文章
- Codeforces Global Round 23 D.Paths on the Tree(记忆化搜索)
https://codeforces.ml/contest/1746/problem/D 题目大意:一棵n节点有根树,根节点为1,分别有两个数组 s[i] 顶点 i 的魅力值 c[i] 覆盖顶点 i ...
- CodeForces Global Round 1
CodeForces Global Round 1 CF新的比赛呢(虽然没啥区别)!这种报名的人多的比赛涨分是真的快.... 所以就写下题解吧. A. Parity 太简单了,随便模拟一下就完了. B ...
- Codeforces Global Round 1 - D. Jongmah(动态规划)
Problem Codeforces Global Round 1 - D. Jongmah Time Limit: 3000 mSec Problem Description Input Out ...
- Codeforces Global Round 2 题解
Codeforces Global Round 2 题目链接:https://codeforces.com/contest/1119 A. Ilya and a Colorful Walk 题意: 给 ...
- Codeforces Global Round 1 (A-E题解)
Codeforces Global Round 1 题目链接:https://codeforces.com/contest/1110 A. Parity 题意: 给出{ak},b,k,判断a1*b^( ...
- Codeforces Global Round 3
Codeforces Global Round 3 A. Another One Bites The Dust 有若干个a,有若干个b,有若干个ab.你现在要把这些串拼成一个串,使得任意两个相邻的位置 ...
- Codeforces Global Round 1 (CF1110) (未完结,只有 A-F)
Codeforces Global Round 1 (CF1110) 继续补题.因为看见同学打了这场,而且涨分还不错,所以觉得这套题目可能会比较有意思. 因为下午要开学了,所以恐怕暂时不能把这套题目补 ...
- 【手抖康复训练1 】Codeforces Global Round 6
[手抖康复训练1 ]Codeforces Global Round 6 总结:不想复习随意打的一场,比赛开始就是熟悉的N分钟进不去时间,2333,太久没写题的后果就是:A 题手抖过不了样例 B题秒出思 ...
- Codeforces Global Round 11 个人题解(B题)
Codeforces Global Round 11 1427A. Avoiding Zero 题目链接:click here 待补 1427B. Chess Cheater 题目链接:click h ...
随机推荐
- java学习第三天常用类.day12
String String 类是不可改变的,所以你一旦创建了 String 对象,那它的值就无法改变了 如果需要对字符串做很多修改,那么应该选择使用 StringBuffer & String ...
- 从零开始Blazor Server(15)--总结
我们用了14篇文章,基本上把一个后台管理系统需要的UI部分都说的差不多了.所以这套文章也该到了结束的时候了. 这里面有很多问题,比如我们直接使用UI来拉数据库信息而没有使用service,再比如我们大 ...
- 【NOI P模拟赛】奶油蛋糕塔(状压 DP)
题面 数据范围 1 ≤ n ≤ 5 × 1 0 5 1\leq n\leq5\times10^5 1≤n≤5×105 . 题解 n ≤ 20 n\leq 20 n≤20 的状压应该都会吧,状态记录已经 ...
- 【Java】学习路径63-反射、类的加载-附思维导图(完结)
这一章的知识在实际开发也没有那么重要,主要是了解即可,另外掌握如何使用反射机制. 类的使用: 在虚拟机中: 类的加载->类的连接->类的初始化 类的加载 只会加载需要用到的类,加载到内 ...
- django_day04
django_day04 路由 from django.conf.urls import url urlpatterns = [ url(正则表达式, views视图,参数,别名), ] 正则表达式 ...
- 第五十九篇:关于Vue
好家伙,前面关于vue的学习太散太乱了,我决定重新整理一下知识框架,当作复习了,并且在其中补充一些概念 先提出一个问题:怎么把数据弄到页面上? 若不借助vue,把数据填充到页面上, 我们需要操作dom ...
- Karmada v1.3:更优雅 更精准 更高效
摘要:最新发布的1.3版本中,Karmada重新设计了应用跨集群故障迁移功能,实现了基于污点的故障驱逐机制,并提供平滑的故障迁移过程,可以有效保障服务迁移过程的连续性(不断服). 本文分享自华为云社区 ...
- e1000e网卡驱动在麒麟3.2.5上编译安装
一.清空原驱动 因为系统安装完毕后系统中自带了e1000e的网卡驱动,会影响后面自行编译的驱动 所以先用find命令找出并删除掉所有关于e1000e的驱动文件 find / -name "* ...
- 创建x11vnc系统进程
〇.前言 为方便使用vnc,所以寻找到一个比较好用的vnc服务端那就是x11vnc,索性就创建了一个系统进程 一.环境 系统:银河麒麟v4-sp2-server 软件:x11vnc[linux下].V ...
- 手把手教你用Java获取IP归属地
前几个月微信公众号上线了IP归属地的功能,后续知乎.抖音等平台纷纷添加了该功能.如果是国内的用户精确到省份,国外用户精确到国家.本文就使用Java实现获取IP归属地. ! 主要讲解几个步骤: Java ...