Codeforces Round #881 (Div. 3) A-F
A
代码
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int a[57];
bool solve() {
int n;
cin >> n;
for (int i = 1;i <= n;i++) cin >> a[i];
sort(a + 1, a + n + 1);
int sum = 0;
for (int i = 1;i <= n / 2;i++) sum += a[n - i + 1] - a[i];
cout << sum << '\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
代码
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
bool solve() {
int n;
cin >> n;
int cnt = 0, last = 1;
ll sum = 0;
for (int i = 1;i <= n;i++) {
int x;
cin >> x;
sum += abs(x);
if (x < 0) cnt += last == 1, last = -1;
if (x > 0) last = 1;
}
cout << sum << ' ' << 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
代码
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
bool solve() {
ll n;
cin >> n;
ll ans = 0, sum = 0;
for (int i = 62;i >= 0;i--) {
(sum <<= 1) |= (n >> i) & 1;
ans += sum;
}
cout << ans << '\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
代码
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
vector<int> g[200007];
int f[200007];
void dfs(int u, int fa) {
for (auto v : g[u]) {
if (v == fa) continue;
dfs(v, u);
f[u] += f[v];
}
if (!f[u]) f[u] = 1;
}
bool solve() {
int n;
cin >> n;
for (int i = 1;i <= n;i++) g[i].clear(), f[i] = 0;
for (int i = 1;i <= n - 1;i++) {
int u, v;
cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
dfs(1, 0);
int q;
cin >> q;
while (q--) {
int u, v;
cin >> u >> v;
cout << 1LL * f[u] * f[v] << '\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;
}
E
题意
有一个长为 \(n\) 的数组 \(a\) ,初始时 \(a_i = 0\) 。
对于一个区间 \([l,r]\) ,若 \(a_i(l \leq i \leq r)\) 为 \(1\) 的数量严格大于 \(0\) 的数量,则称这个区间是美丽的。
现在给出 \(m\) 个区间,以及 \(q\) 个操作,每个操作都是:给定一个位置 \(x\) ,将 \(a_x\) 变为 \(1\) 。
操作按顺序执行,最少执行几个操作,使得 \(m\) 个区间中至少有一个区间是美丽的。
题解
知识点:前缀和,二分。
考虑二分答案,每次检验暴力执行所有需要的操作,再算一遍前缀和,最后对每个区间查询即可。
时间复杂度 \(O((n+m+q) \log q)\)
空间复杂度 \(O(n+m+q)\)
代码
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int n, m, q;
int Q[100007], l[100007], r[100007];
bool check(int x) {
vector<int> sum(n + 1);
for (int i = 1;i <= x;i++) sum[Q[i]] = 1;
for (int i = 1;i <= n;i++) sum[i] += sum[i - 1];
for (int i = 1;i <= m;i++)
if (2 * (sum[r[i]] - sum[l[i] - 1]) > r[i] - l[i] + 1) return true;
return false;
}
bool solve() {
cin >> n >> m;
for (int i = 1;i <= m;i++) cin >> l[i] >> r[i];
cin >> q;
for (int i = 1;i <= q;i++) cin >> Q[i];
int l = 1, r = q;
while (l <= r) {
int mid = l + r >> 1;
if (check(mid)) r = mid - 1;
else l = mid + 1;
}
cout << (l > q ? -1 : l) << '\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;
}
F
题意
地铁系统是一棵树且根节点为 \(1\) ,每个节点都有一个权值 \(x \in \{-1,1\}\) 。
初始时只有根节点,现在给出 \(n\) 个操作,有两种:
- 为指定节点 \(v\) 增加一个儿子,编号为当前最大编号加 \(1\) ,权值为 \(x\) 。
- 查询路径 \((u,v)\) 上,是否存在一个子段的和为 \(k\) 。
题解
知识点:倍增,LCA。
由于权值都是 \(\pm 1\) 的,考虑将子段和为 \(k\) 转化为 \(k\) 在最小子段和与最大子段和之间即可。
同时操作是尾加不带修的,因此树上倍增就可以在线解决了(否则要离线+树剖+线段树)。
现在只需要维护子链的最小子段和以及最大子段和即可,注意这里子链性质不具有交换律,因此要注意严格区分合并的左右。
时间复杂度 \(O(n \log n)\)
空间复杂度 \(O(n \log n)\)
代码
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
struct T {
int sum = 0;
int lmn = 0;
int rmn = 0;
int mn = 0;
int lmx = 0;
int rmx = 0;
int mx = 0;
T(int x = 0) {
sum = x;
lmn = min(x, 0);
rmn = min(x, 0);
mn = min(x, 0);
lmx = max(x, 0);
rmx = max(x, 0);
mx = max(x, 0);
};
void rev() {
swap(lmn, rmn);
swap(lmx, rmx);
}
friend T operator+(const T &a, const T &b) {
T ans;
ans.sum = a.sum + b.sum;
ans.lmn = min(a.lmn, a.sum + b.lmn);
ans.rmn = min(b.rmn, a.rmn + b.sum);
ans.mn = min({ a.mn,b.mn,a.rmn + b.lmn });
ans.lmx = max(a.lmx, a.sum + b.lmx);
ans.rmx = max(b.rmx, a.rmx + b.sum);
ans.mx = max({ a.mx,b.mx,a.rmx + b.lmx });
return ans;
}
};
int cnt;
int x[200007];
int dep[200007], p[20][200007];
T f[20][200007];
void update(int u, int fa) {
p[0][u] = fa;
dep[u] = dep[fa] + 1;
f[0][u] = T(x[fa]);
for (int i = 1;i <= 19;i++) {
p[i][u] = p[i - 1][p[i - 1][u]];
f[i][u] = f[i - 1][u] + f[i - 1][p[i - 1][u]];
}
}
T query(int u, int v) {
if (dep[u] < dep[v]) swap(u, v);
T l = T(x[u]), r = T(x[v]);
for (int i = 19;i >= 0;i--) {
if (dep[p[i][u]] >= dep[v]) {
l = l + f[i][u];
u = p[i][u];
}
if (u == v) return l;
}
for (int i = 19;i >= 0;i--) {
if (p[i][u] != p[i][v]) {
l = l + f[i][u];
r = r + f[i][v];
u = p[i][u];
v = p[i][v];
}
}
r.rev();
return l + f[0][u] + r;
}
bool solve() {
int n;
cin >> n;
cnt = 1;
x[1] = 1;
update(1, 0);
while (n--) {
char op;
cin >> op;
if (op == '+') {
int fa, w;
cin >> fa >> w;
x[++cnt] = w;
update(cnt, fa);
}
else {
int u, v, k;
cin >> u >> v >> k;
T ans = query(u, v);
if (ans.mn <= k && k <= ans.mx) 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;
}
Codeforces Round #881 (Div. 3) A-F的更多相关文章
- Codeforces Round #573 (Div. 1) 差F
Codeforces Round #573 (Div. 1) E 题意:二维平面上有 n 个点,你可以放至多 m 条直线使得 (0,0) 与每个点的连线至少与一条直线相交.求原点与所有直线的距离最小值 ...
- Codeforces Round #541 (Div. 2) (A~F)
目录 Codeforces 1131 A.Sea Battle B.Draw! C.Birthday D.Gourmet choice(拓扑排序) E.String Multiplication(思路 ...
- Codeforces Round #532 (Div. 2):F. Ivan and Burgers(贪心+异或基)
F. Ivan and Burgers 题目链接:https://codeforces.com/contest/1100/problem/F 题意: 给出n个数,然后有多个询问,每次回答询问所给出的区 ...
- Codeforces Round #600 (Div. 2)E F
题:https://codeforces.com/contest/1253/problem/E 题意:给定n个信号源,俩个参数x和s,x代表这个信号源的位置,s代表这个信号源的波及长度,即这个信号源可 ...
- Codeforces Round #346 (Div. 2) E F
因为很久没有个人认真做题了 昨天晚上开了场虚拟cf来锻炼个人手速 选的是第一次做cf的场 那时候7出3还被hack...之后也没补题 这次做的时候顺便回忆了一下以前比赛的时候是怎么想的 发现经验还是很 ...
- Codeforces Round #322 (Div. 2) E F
E. Kojiro and Furrari 题意说的是 在一条直线上 有n个加油站, 每加一单位体积的汽油 可以走1km 然后每个加油站只有一种类型的汽油,汽油的种类有3种 求从起点出发到达终点要求使 ...
- Codeforces Round #506 (Div. 3) 1029 F. Multicolored Markers
CF-1029F 题意: a,b个小正方形构造一个矩形,大小为(a+b),并且要求其中要么a个小正方形是矩形,要么b个小正方形是矩形. 思路: 之前在想要分a,b是否为奇数讨论,后来发现根本不需要.只 ...
- Codeforces Round #648 (Div. 2) A~F题解
开始补cf了,还是记录一下,加深思路,打的应该都是div2.题面不截图了,直接说题意,思路,代码. A 题意:给一个01矩阵,两个人轮流填格子,仅当第i行,第j列全为0时才能填,不能填的人输,问谁赢? ...
- Codeforces Round #485 (Div. 2) F. AND Graph
Codeforces Round #485 (Div. 2) F. AND Graph 题目连接: http://codeforces.com/contest/987/problem/F Descri ...
- Codeforces Round #486 (Div. 3) F. Rain and Umbrellas
Codeforces Round #486 (Div. 3) F. Rain and Umbrellas 题目连接: http://codeforces.com/group/T0ITBvoeEx/co ...
随机推荐
- 【Azure Developer】使用 Microsoft Graph API 获取 AAD User 操作示例
问题描述 查看官方文档" Get a user " , 产生了一个操作示例的想法,在中国区Azure环境中,演示如何获取AAD User信息. 问题解答 使用Microsoft G ...
- Linux操作系统网络模块
Linux操作系统的网络模块是负责网络通信的核心部分.它通过实现各种协议和算法,使得计算机能够在网络中进行数据交换和通信.网络模块主要包括以下几个方面的功能: (1)IP协议栈:负责处理网络层的数据包 ...
- 操作系统实验 & bochs 环境配置
wsl2 - Ubuntu 22.04 + VSCode + bochs + xfce4 + VcXsrv 笔者环境 wsl2 - Ubuntu 22.04 0. 安装WSL2 & VSCod ...
- 【Lua】VSCode 搭建 Lua 开发环境
前言 最近在找工作,基本所有的岗位都会问到 Lua(甚至拼 UI 的都要求会 Lua),咱能怎么办呢,咱也只能学啊-- 工欲善其事,必先利其器.第一步,先来把环境配置好吧! 当前适用版本: LuaBi ...
- Flowable启动报错problem during schema upgrade&&couldn‘t upgrade db schema:
1.错误信息 problem during schema upgrade, statement alter table ACT_RU_VARIABLE add column SCOPE_ID_ var ...
- day06-优惠券秒杀02
功能03-优惠券秒杀02 4.功能03-优惠券秒杀 4.4一人一单 4.4.1需求分析 要求:修改秒杀业务,要求同一个优惠券,一个用户只能下一单. 在之前的做法中,加入一个对用户id和优惠券id的判断 ...
- 大话AI绘画技术原理与算法优化
引子 博主很长一段时间都没有发文,确实是在忙一些技术研究. 如标题所示,本篇博文主要把近段时间的研究工作做一个review. 看过各种相关技术的公关文章,林林总总,水分很多. 也确实没有多少人能把一些 ...
- Codeforces Round #844 (Div. 1 + Div. 2, based on VK Cup 2022 - Elimination Round) 小记
在机房其它人都有许多的橙名小号后我终于大号上橙了(果然还是太菜了),写篇博客记录一下. 计数水平太弱,赛场最后 5 分钟乱糊了一个 F 的做法,后来发现其它人做法都短好多. A & B &am ...
- ADG无法切换:报错 ORA-16467
现象: ADG无法切换:验证时就报错 ORA-16467 记录问题,顺便展现一次troubleshooting的心路历程. 具体查询: 在主库操作, @primary 切换验证: alter data ...
- 2023-03-22:给定一个字符串str, 如果删掉连续一段子串,剩下的字符串拼接起来是回文串, 那么该删除叫做有效的删除。 返回有多少种有效删除。 注意 : 不能全删除,删成空串不允许, 字符串长
2023-03-22:给定一个字符串str, 如果删掉连续一段子串,剩下的字符串拼接起来是回文串, 那么该删除叫做有效的删除. 返回有多少种有效删除. 注意 : 不能全删除,删成空串不允许, 字符串长 ...