比赛链接

A

代码

#include <bits/stdc++.h>
using namespace std;
using ll = long long; bool solve() {
int n, m, k;
cin >> n >> m >> k;
int x, y;
cin >> x >> y;
bool ok = 1;
for (int i = 1;i <= k;i++) {
int xx, yy;
cin >> xx >> yy;
ok &= abs(x - xx) + abs(y - yy) & 1;
}
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

代码

#include <bits/stdc++.h>
using namespace std;
using ll = long long; vector<int> c[200007];
bool solve() {
int n, k;
cin >> n >> k;
for (int i = 1;i <= k;i++) c[i].clear();
for (int i = 1;i <= k;i++) c[i].push_back(0);
for (int i = 1;i <= n;i++) {
int x;
cin >> x;
c[x].push_back(i);
}
for (int i = 1;i <= k;i++) c[i].push_back(n + 1); int ans = n;
for (int i = 1;i <= k;i++) {
priority_queue<int> pq;
for (int j = 1;j < c[i].size();j++) pq.push(c[i][j] - c[i][j - 1] - 1);
int mx = pq.top();
if (mx) {
pq.pop();
pq.push((mx - 1) / 2);
pq.push(mx / 2);
}
ans = min(ans, pq.top());
}
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;
}

C

题意

给定长为 \(n\) 的数组 \(a,b\) ,每次操作使得 \(a_i,b_i = b_i,|a_i-b_i|(1\leq i \leq n)\) 。

问是否可以通过若干次操作使得 \(a_i = 0(1 \leq i \leq n)\) 。

题目

知识点:数论。

注意到,操作到最后一定能使得 \(a_i = 0\) ,并进入周期为 \(3\) 的循环,那么只要每个位置的数字进入循环的操作次数模 \(3\) 同余即可。

模拟操作显然是不行的。注意到 \(a_i \geq 2b_i\) 时,有 \((a_i,b_i) \to (b_i,a_i-b_i) \to (a_i-b_i,a_i-2b_i) \to (a_i-2b_i,b_i)\) 。因此,可以直接 \(a_i \bmod 2b_i\) ,这样不影响操作次数模 \(3\) 的结果。随后,执行操作一次继续上述操作。

时间复杂度 \(O(n \log 10^9)\)

空间复杂度 \(O(n)\)

代码

#include <bits/stdc++.h>
using namespace std;
using ll = long long; int a[100007], b[100007];
bool solve() {
int n;
cin >> n;
for (int i = 1;i <= n;i++) cin >> a[i];
for (int i = 1;i <= n;i++) cin >> b[i]; int ok = -1;
for (int i = 1;i <= n;i++) {
if (a[i] == 0 && b[i] == 0) continue;
int tmp = 0;
while (a[i]) {
if (b[i]) a[i] %= 2 * b[i];
swap(a[i], b[i]);
b[i] = abs(a[i] - b[i]);
(++tmp) %= 3;
}
if (ok == -1) ok = tmp;
else if (ok != tmp) return false;
}
cout << "YES" << '\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 << "NO" << '\n';
}
return 0;
}

D

题意

初始时有奖金 \(s\) ,接下来可以执行 \(k\) 次操作,每次操作以下的一种:

  1. 奖金 \(s\) 加上 \(s\) 的个位数字。
  2. 使用奖金 \(s\) ,不会使得奖金减少,使用的奖金会累加。

问最多能使用多少奖金。

题目

知识点:数学,三分。

显然要尽可能将 \(s\) 变大,再开始使用。

模拟操作1显然复杂度不行,考虑找到 \(s\) 增加的循环节。

我们发现 \(s \bmod 10 = 0 \text{ 或 } 5\) 时,至多操作 \(1\) 次就不需要继续操作了。因此,考虑取不操作的答案和操作 \(1\) 次的答案的最大值即可。

对于其他情况,至多操作 \(1\) 次就会进入 \(6,2,4,8\) 的循环,因此同样也记录不操作的答案和操作 \(1\) 次的答案的最大值,之后可以利用循环快速计算答案。

对于一开始的贪心结论,我们很容易想到凸函数三分求极值,但样例提示这不是一个凸函数。注意到,循环节长度只有 \(4\) ,若我们枚举终点在循环节中的位置,那么剩下的就是以常数 \(20\) 增加,这显然是个凸函数,可以用三分。

进一步地,最后那个凸函数是个二次函数,也可以直接求抛物线对称轴得到最值。

时间复杂度 \(O(\log k)\)

空间复杂度 \(O(1)\)

代码

#include <bits/stdc++.h>
using namespace std;
using ll = long long; bool solve() {
ll s, k;
cin >> s >> k;
ll ans = s * k;
s += s % 10;
k--;
ans = max(ans, s * k);
if (s % 10 == 0) {
cout << ans << '\n';
return true;
} auto check = [&](ll x) {
return (s + x * 20) * (k - x * 4);
};
for (int i = 0;i < 4 && k;i++, s += s % 10, k--) {
ll l = 0, r = k / 4;
while (l <= r) {
ll mid1 = l + (r - l) / 3;
ll mid2 = r - (r - l) / 3;
if (check(mid1) <= check(mid2)) l = mid1 + 1;
else r = mid2 - 1;
}
ans = max(ans, check(r));
}
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;
}

Codeforces Round #885 (Div. 2) A-D的更多相关文章

  1. Codeforces Round #366 (Div. 2) ABC

    Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...

  2. Codeforces Round #354 (Div. 2) ABCD

    Codeforces Round #354 (Div. 2) Problems     # Name     A Nicholas and Permutation standard input/out ...

  3. Codeforces Round #368 (Div. 2)

    直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...

  4. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

  5. Codeforces Round #279 (Div. 2) ABCDE

    Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems     # Name     A Team Olympiad standard input/outpu ...

  6. Codeforces Round #262 (Div. 2) 1003

    Codeforces Round #262 (Div. 2) 1003 C. Present time limit per test 2 seconds memory limit per test 2 ...

  7. Codeforces Round #262 (Div. 2) 1004

    Codeforces Round #262 (Div. 2) 1004 D. Little Victor and Set time limit per test 1 second memory lim ...

  8. Codeforces Round #371 (Div. 1)

    A: 题目大意: 在一个multiset中要求支持3种操作: 1.增加一个数 2.删去一个数 3.给出一个01序列,问multiset中有多少这样的数,把它的十进制表示中的奇数改成1,偶数改成0后和给 ...

  9. Codeforces Round #268 (Div. 2) ABCD

    CF469 Codeforces Round #268 (Div. 2) http://codeforces.com/contest/469 开学了,时间少,水题就不写题解了,不水的题也不写这么详细了 ...

  10. 贪心+模拟 Codeforces Round #288 (Div. 2) C. Anya and Ghosts

    题目传送门 /* 贪心 + 模拟:首先,如果蜡烛的燃烧时间小于最少需要点燃的蜡烛数一定是-1(蜡烛是1秒点一支), num[g[i]]记录每个鬼访问时已点燃的蜡烛数,若不够,tmp为还需要的蜡烛数, ...

随机推荐

  1. .NET敏捷开发框架-RDIFramework.NET V5.1发布(跨平台)

    RDIFramework.NET,基于全新.NET Framework与.NET Core的快速信息化系统敏捷开发.整合框架,给用户和开发者最佳的.Net框架部署方案.为企业快速构建跨平台.企业级的应 ...

  2. .NET Web入门到高级路线(新版本)

    .NET Web入门到高级路线 C# 基础语法 .NET Core 基础知识 ASP.NET Core基础知识概述 Blazor ASP.NET Core 官方文档 ORM FreeSql Entit ...

  3. 第4章. 安装reco主题

    大家可以按照我的教程来安装,也可以访问 reco_luan 大佬的 官方教程 根据自己的电脑类型和开发环境配置,来选择合适的安装方式. 一.快速开始 npx # 初始化,并选择 2.x npx @vu ...

  4. js中 call()与apply()方法 和 bind()方法

    call与apply都属于Function.prototype(即原型对象身上的方法)的一个方法,所以每个function实例都有call.apply属性: call()和apply() 是静态方法, ...

  5. 为HttpClient开启HTTP/2

    .Net Core在调用其他服务时,调用通常使用HttpClient,而HttpClient默认使用HTTP/1.1 . 配置 HttpClient 以使用 HTTP/2 h2 连接 自 .NET C ...

  6. 【Redis】Setninel 哨兵机制

    一.Sentinel 哨兵工作原理 Redis在2.6+以后引入哨兵机制,在2.8版本后趋于稳定状态,在生产环境中建议使用2.8版本以上的sentinel服务.sentinel集群用于监控redis集 ...

  7. 2021-01-18:java中,HashMap的创建流程是什么?

    福哥答案2021-01-18: jdk1.7创建流程:三种构造器.1.初始容量不能为负数,默认16.2.初始容量大于最大容量时,初始容量等于最大容量.3.负载因子必须大于0,默认0.75.4.根据初始 ...

  8. 2021-03-08:在一个数组中,任何一个前面的数a,和任何一个后面的数b,如果(a,b)是降序的,就称为逆序对。返回逆序对个数。

    2021-03-08:在一个数组中,任何一个前面的数a,和任何一个后面的数b,如果(a,b)是降序的,就称为逆序对.返回逆序对个数. 福哥答案2021-03-08: 1.归并排序,从右往左,相等拷右. ...

  9. 大三ACM第一次开会

    现在是2020.9.12,单说时间的话可能感知不太强,那么换个时间, 现在是大三上.按照设想,我应该已经退役. 会上,老李的语气不再激昂,满含着无奈与沧桑.面对围在桌前的大三们,终究还是提出了那个问题 ...

  10. SpringBoot 使用 Sa-Token 完成路由拦截鉴权

    一.需求分析 在前文,我们详细的讲述了在 Sa-Token 如何使用注解进行权限认证,注解鉴权虽然方便,却并不适合所有鉴权场景. 假设有如下需求:项目中所有接口均需要登录认证校验,只有 "登 ...