Codeforces Round #827 (Div. 4) A-G
A
题解
知识点:模拟。
时间复杂度 \(O(1)\)
空间复杂度 \(O(1)\)
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
bool solve() {
int a, b, c;
cin >> a >> b >> c;
if (a + b == c || a + c == b || b + c == a) 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
题解
知识点:枚举。
查重即可。
时间复杂度 \(O(n \log n)\)
空间复杂度 \(O(n)\)
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
bool solve() {
int n;
cin >> n;
set<int> st;
bool ok = 1;
for (int i = 1;i <= n;i++) {
int x;
cin >> x;
if (st.count(x)) ok = 0;
st.insert(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;
}
C
题解
知识点:贪心。
行红,列蓝别搞错。
时间复杂度 \(O(1)\)
空间复杂度 \(O(1)\)
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
char dt[10][10];
bool solve() {
for (int i = 1;i <= 8;i++)
for (int j = 1;j <= 8;j++)
cin >> dt[i][j];
for (int i = 1;i <= 8;i++) {
bool ok = 1;
for (int j = 1;j <= 8;j++) ok &= dt[i][j] == 'R';
if (ok) {
cout << 'R' << '\n';
return true;
}
}
for (int j = 1;j <= 8;j++) {
bool ok = 1;
for (int i = 1;i <= 8;i++) ok &= dt[i][j] == 'B';
if (ok) {
cout << 'B' << '\n';
return true;
}
}
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
题解
知识点:枚举,数论。
注意到 \(a_i \in [1,1000]\) ,因此贪心地记录 \(a_i\) 最后一次的位置,枚举 \([1,1000]\) 每个数的组合即可。
时间复杂度 \(O(n+1000^2)\)
空间复杂度 \(O(1000)\)
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int vis[1007];
bool solve() {
int n;
cin >> n;
memset(vis, 0, sizeof(vis));
for (int i = 1;i <= n;i++) {
int x;
cin >> x;
vis[x] = max(vis[x], i);
}
int ans = -1;
for (int i = 1;i <= 1000;i++) {
if (!vis[i]) continue;
for (int j = i;j <= 1000;j++) {
if (!vis[j]) continue;
if (__gcd(i, j) == 1) ans = max(ans, vis[i] + vis[j]);
}
}
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;
}
E
题解
知识点:二分,前缀和,枚举。
预处理前缀和方便输出答案,前缀最大值方便找到最大合法段,然后二分查询第一个大于 \(x\) 的位置 \(i\) ,则 \([1,i-1]\) 都可以。
时间复杂度 \(O(n+q\log n)\)
空间复杂度 \(O(n)\)
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll a[200007], mx[200007];
bool solve() {
int n, q;
cin >> n >> q;
for (int i = 1;i <= n;i++) {
cin >> a[i];
mx[i] = max(mx[i - 1], a[i]);
a[i] += a[i - 1];
}
while (q--) {
int x;
cin >> x;
int pos = upper_bound(mx + 1, mx + 1 + n, x) - mx - 1;
cout << a[pos] << ' ';
}
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;
}
F
题解
知识点:贪心。
我们可以任意排列且 \(s,t\) 初始有 a ,那么如果 \(t\) 具有超过 a 的字母,那么一定可以有 \(s<t\) ;否则,如果 \(s\) 也没有超过 a 的字母且 \(s\) 长度小于 \(t\) ,那么一定可以有 \(s<t\) ;否则一定有 \(t<s\) 。
时间复杂度 \(O(q+\sum |s|)\)
空间复杂度 \(O(|s|)\)
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
bool solve() {
int q;
cin >> q;
ll cnts = 0, cntt = 0;
bool sbad = 0, tgood = 0;
while (q--) {
int d, k;
string x;
cin >> d >> k >> x;
if (d == 1) {
for (auto ch : x) {
cnts += k * (ch == 'a');
sbad |= ch != 'a';
}
}
else {
for (auto ch : x) {
cntt += k * (ch == 'a');
tgood |= ch != 'a';
}
}
if (tgood) cout << "YES" << '\n';
else if (!sbad && cnts < cntt) 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;
}
G
题解
知识点:位运算,贪心,枚举。
用 \(val\) 记录目前哪个位置还缺 \(1\) 。每次枚举没有取过的数字,找到一个数 \(a[pos]\) 使 a[pos] & val 最大,表示有效位组成最大的数字。然后取出来,并通过 val &= ~a[pos] 把 \(val\) 中对应的 \(1\) 删除(把 \(a[pos]\) 取反,原来的 \(1\) 现在都为 \(0\) ,然后与 \(val\) 就能删掉 \(val\) 对应的 \(1\))。最后把 \(a[pos]\) 交换到末尾的有效数字,实现逻辑删除。
因为 int 有 \(31\) 位,每次删除删的是结果最大的,最多删除 \(31\) 次就能达到这个序列或的最大值。
时间复杂度 \(O(n)\)
空间复杂度 \(O(n)\)
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int a[200007];
bool solve() {
int n;
cin >> n;
for (int i = 1;i <= n;i++) cin >> a[i];
int val = ~(1 << 31);
for (int i = 1;i <= min(31, n);i++) {
int pos = 1;
for (int j = 1;j <= n - i + 1;j++) {
if ((val & a[j]) > (val & a[pos])) pos = j;
}
cout << a[pos] << ' ';
val &= ~a[pos];
swap(a[n - i + 1], a[pos]);
}
for (int i = 1;i <= n - min(31, n);i++) cout << a[i] << ' ';
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;
}
Codeforces Round #827 (Div. 4) A-G的更多相关文章
- Educational Codeforces Round 47 (Div 2) (A~G)
目录 Codeforces 1009 A.Game Shopping B.Minimum Ternary String C.Annoying Present D.Relatively Prime Gr ...
- Educational Codeforces Round 46 (Div 2) (A~G)
目录 Codeforces 1000 A.Codehorses T-shirts B.Light It Up C.Covered Points Count(差分) D.Yet Another Prob ...
- Educational Codeforces Round 45 (Div 2) (A~G)
目录 Codeforces 990 A.Commentary Boxes B.Micro-World C.Bracket Sequences Concatenation Problem D.Graph ...
- Codeforces Round #582 (Div. 3)-G. Path Queries-并查集
Codeforces Round #582 (Div. 3)-G. Path Queries-并查集 [Problem Description] 给你一棵树,求有多少条简单路径\((u,v)\),满足 ...
- Codeforces Round #368 (Div. 2)
直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...
- Codeforces Round #279 (Div. 2) ABCDE
Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems # Name A Team Olympiad standard input/outpu ...
- 贪心+模拟 Codeforces Round #288 (Div. 2) C. Anya and Ghosts
题目传送门 /* 贪心 + 模拟:首先,如果蜡烛的燃烧时间小于最少需要点燃的蜡烛数一定是-1(蜡烛是1秒点一支), num[g[i]]记录每个鬼访问时已点燃的蜡烛数,若不够,tmp为还需要的蜡烛数, ...
- Codeforces Round #383 (Div. 2) 题解【ABCDE】
Codeforces Round #383 (Div. 2) A. Arpa's hard exam and Mehrdad's naive cheat 题意 求1378^n mod 10 题解 直接 ...
- 模拟 Codeforces Round #249 (Div. 2) C. Cardiogram
题目地址:http://codeforces.com/contest/435/problem/C /* 题意:给一组公式,一组数据,计算得到一系列的坐标点,画出折线图:) 模拟题:蛮恶心的,不过也简单 ...
随机推荐
- 浅谈MySQL的sql_mode
SQL mode 今天我们来分享一下MySQL的SQL mode , 这也是我们比较容易忽略的一点,我们在一开始安装数据库的时候其实就要先考虑要保留哪些SQL mode,去除哪些,合理的配置能够减少很 ...
- 虚拟化之mdev-vfio笔记
[root@master mdev]# vi Makefile # SPDX-License-Identifier: GPL-2.0-only mdev-y := mdev_core.o mdev_s ...
- 学军中学第三届“图灵杯”趣味网络邀请赛——中级T4.欧拉回路 (图论,哈希)
题面 补题链接 7 5 6 7 1 2 3 3 13 5 30 50 10 30 70 8 题解 存在欧拉回路的条件是:1. 每个点的度数都是偶数.2. 有边的连通块最多一个. 数据范围是允许我们 n ...
- 【java】学习路径40-Buffer缓冲区输入流
@Testpublic void testBufferInputStream(){ BufferedInputStream bfis = null; try { bfis = new Buffered ...
- qt C2144 语法错误,需要在类型前添加;(分号)
可能原因:有部分头文件未以";"结尾.
- 【python】生成一段连续的日期
date-gen.py import datetime def date_generate(start_date, end_date): print(f'Hi, {start_date}, {end_ ...
- MySQL建表语句生成Golang代码
1. 背景 对于后台开发新的需求时,一般会先进行各种表的设计,写各个表的建表语句 然后根据建立的表,写对应的model代码.基础的增删改查代码(基础的增删改查服务可以划入DAO(Data Access ...
- 使用C#编写一个.NET分析器(一)
译者注 这是在Datadog公司任职的Kevin Gosse大佬使用C#编写.NET分析器的系列文章之一,在国内只有很少很少的人了解和研究.NET分析器,它常被用于APM(应用性能诊断).IDE.诊断 ...
- [开源]React/Vue通用的状态管理框架,不好用你来打我👀
为了防止被打,有请"燕双鹰"镇楼️♀️️️...o... 话说新冠3年,"状态管理框架"豪杰并起.群雄逐鹿,ReduxToolkit.Mobx.Vuex. ...
- IK分词器实现原理剖析 —— 一个小问题引发的思考
前言: 网上很多的文章都建议在使用IK分词器的时候,建立索引的时候使用ik_max_word模式:搜索的时候使用ik_smart模式.理由是max_word模式分词的结果会包含smart分词的结果,这 ...