FST ROUND !!1

A Three swimmers:

直接整除一下向上取整就好了:

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int N = 2e5 + 10;
ll p,a,b,c;
int main() {
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int times;
cin >> times;
while(times--) {
cin >> p >> a >> b >> c;
cout << min((p + a - 1) / a * a - p,min((p + b - 1) / b * b - p,(p + c - 1) / c * c - p)) << '\n';
}
return 0;
}

B Card Deck:

(本人 CF 打得很少但感觉一般都是这种通过性质条件贪心的题)

保证了原数列是一个排列 \(1 \le a_i \le n\),而每一位差异的系数等于 \(n\)。

所以每次找剩余部分的最大值即可。

本人懒得写数据结构,写了个堆和删除堆(太久没写过在赛场上差点没写出来 /kk)

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
priority_queue<pair<int,int> > p; priority_queue<pair<int,int> > del;
int a[N];
int b[N],cnt = 0;
int n,m;
int times;
int main() {
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin >> times;
while(times--) {
cin >> n ;
for(int i = 1;i <= n;i++) {
cin >> a[i];
p.push(make_pair(a[i],i));
}
int poi = n;
cnt = 0;
while(p.empty() == false) {
while(p.empty() == false && del.empty() == false && p.top() == del.top()) {
p.pop(),del.pop();
}
if(p.empty()) break;
int u = p.top().second;
for(int i = u;i <= poi;i++) {
b[++cnt] = a[i];
del.push(make_pair(a[i],i));
}
poi = u - 1;
}
for(int i = 1;i <= n;i++) {
cout << b[i] << ' ';
}
cout << '\n';
}
return 0;
}

C Maximum width:

比较显然的一个贪心,因为每一个 \(s\) 中必会存在 \(t\) 所以对于 \(t\) 每一位可以得到一个合法取值的最小/大值(正反扫一遍)。

对于相邻的两个数 \(i,i + 1\),以 \(i\) 为分界分开,\(i\) 及 \(i\) 以前的都取最小情况,\(i + 1\) 及其以后都取最大情况,便可以保证合法性。

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int N = 2e5 + 10;
int n,m;
char s[N],t[N];
int poi = 0;
int Er[N],La[N];
int main() {
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin >> n >> m;
cin >> (s + 1);
cin >> (t + 1);
poi = 1;
for(int i = 1;i <= n;i++) {
if(s[i] == t[poi]) {
Er[poi] = i;
poi++;
}
if(poi > m) break;
}
poi = m;
for(int i = n;i >= 1;i--) {
if(s[i] == t[poi]) {
La[poi] = i;
poi--;
}
if(!poi) break;
}
int ans = 0;
for(int i = 1;i < m;i++) {
ans = max(ans,abs(Er[i] - La[i + 1]));
}
cout << ans << '\n';
return 0;
}

D Genius's Gambit:

魔鬼题,机房仅有一人没有被 \(\texttt{FST}\)。

注意到类似于这样的一种情况,相减后总是会贡献出 \(len\) 长度的 \(1\):(以下为两个长度为 \(len + 1\) 的字符串)

\(\texttt{1111...1100...0000}\)

\(\texttt{1011...1100...0001}\)

所以我们一开始令第一个串类似于这样的结构 :

\(\texttt{1111...1100...0000}\)

这样只需找到这个序列的第 \(i\) 位交换到第 \(i + k\) 位即可得到第二个串。(满足 \(a[i] = 1,a[i + k] = 0\))

但是此题边界条件很多:

首先考虑构造的时候条件:满足 \(k \ge a + b - 1\) 时无解。

当 \(a = 0\) 时,当且仅当 \(k = 0\) 有解。

当 \(b = 1\) 时,当且仅当 \(k = 0\) 有解。

但还有一个特例 :

\(a = 0,b = 1,k = 0.\)

这一个特例并不满足 \(k \le a + b - 2\) 但确实有解。

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
char ans[300000];
int main() {
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int a,b,k;
cin >> a >> b >> k;
if(!a) {
if(!k) {
cout << "Yes" << '\n';
for(int i = 1;i <= b;i++) {
cout << "1" ;
}
cout << '\n';
for(int i = 1;i <= b;i++) {
cout << "1" ;
}
} else {
cout << "No" << '\n';
}
return 0;
}
if(b == 1) {
if(!k) {
cout << "Yes" << '\n';
cout << '1' ;
for(int i = 1;i <= a + b - 1;i++) {
cout << '0';
}
cout << '\n';cout << '1' ;
for(int i = 1;i <= a + b - 1;i++) {
cout << '0';
}
cout << '\n';
} else {
cout << "No";
return 0;
}
return 0;
}
if(k >= a + b - 1) {
cout << "No" << '\n';
return 0;
} cout << "Yes" << '\n';
for(int i = 1;i <= b;i++) ans[i] = '1';
for(int i = b + 1;i <= a + b;i++) ans[i] = '0';
for(int i = 1;i <= a + b;i++) cout << ans[i];cout << '\n';
for(int i = 2;i <= a + b;i++) {
if(ans[i] == '1' && ans[i + k] == '0') {
swap(ans[i],ans[i + k]);
break;
}
}
for(int i = 1;i <= a + b;i++) {
cout << ans[i];
}
return 0;
}

E Almost Fault-Tolerant Database:

因为要构造一串序列要满足与任意序列的不同处不超过 \(2\) ,不如就直接取第一个序列然后加之修改。

考虑第一个序列和其余序列可能存在的情况:

  1. 和一个串的不同处 \(>4\) ,这时无论如何都是无解。
  2. 和每一个串的不同处 $ \le 2$ ,这时这一个序列就可以是答案。
  3. 存在一些序列不同处 \(=3,4\) ,考虑如何处理使不同处减小到 \(2\) 以下。

首先不难发现,如果只有一对不同串不同处大于 \(2\),我们可以去枚举造成不同的位置 ,对其进行更改,使现在不同处 \(\le 2\),然后去检查修改后的串是否满足整个序列不同处 \(\le 2\)。

如果此时只有三个串不同处大于 \(2\),我们可以任意选择一个串进行修改,因为每次修改都是枚举完了所有不同处的情况的,如果此时修改后检查不合法,那么枚举另一个串修改了检查时也会不合法。

所以一开始选取一个与第一个串不同处最多的串,然后枚举修改的位置即可。

注意到有可能修改会修改成为其余序列的值,所以将其中一个设定为 \(-1\) 处理,表示这个位置可以被修改。

最终实现的复杂度为 \(O(nm)\) ,常数不大。

CODE

Codeforces Round#704 Div2 题解(A,B,C,D,E)的更多相关文章

  1. [Codeforces Round #461 (Div2)] 题解

    [比赛链接] http://codeforces.com/contest/922 [题解] Problem A. Cloning Toys          [算法] 当y = 0 ,   不可以 当 ...

  2. CodeForces round 967 div2 题解(A~E)

    本来准备比完赛就写题解的, 但是一拖拖了一星期, 唉 最后一题没搞懂怎么做,恳请大神指教 欢迎大家在评论区提问. A Mind the Gap 稳定版题面 https://cn.vjudge.net/ ...

  3. Codeforces Round #407 div2 题解【ABCDE】

    Anastasia and pebbles 题意:你有两种框,每个框可以最多装k重量的物品,但是你每个框不能装不一样的物品.现在地面上有n个物品,问你最少多少次,可以把这n个物品全部装回去. 题解:其 ...

  4. Codeforces Round #467(Div2)题解

    凌晨起来打CF,0:05,也是我第一次codeforces 第一题: 我刚开始怀疑自己读错题了,怎么会辣么水. 判除了0的数字种类 #include <cstdio> ; ]; int m ...

  5. Codeforces Round#687 Div2 题解

    打这场的时候迷迷糊糊的,然后掉分了( A Prison Break: 题面很复杂,但是题意很简单,仅需求出从这个点到四个角的最大的曼哈顿距离即可 #include <bits/stdc++.h& ...

  6. CodeForces Round #516 Div2 题解

    A. Make a triangle! 暴力... 就是给你三个数,你每次可以选一个加1,问最少加多少次能构成三角形 #include <bits/stdc++.h> #define ll ...

  7. Codeforces Round #539 div2

    Codeforces Round #539 div2 abstract I 离散化三连 sort(pos.begin(), pos.end()); pos.erase(unique(pos.begin ...

  8. Codeforces Round #543 Div1题解(并不全)

    Codeforces Round #543 Div1题解 Codeforces A. Diana and Liana 给定一个长度为\(m\)的序列,你可以从中删去不超过\(m-n*k\)个元素,剩下 ...

  9. Codeforces Round #545 Div1 题解

    Codeforces Round #545 Div1 题解 来写题解啦QwQ 本来想上红的,结果没做出D.... A. Skyscrapers CF1137A 题意 给定一个\(n*m\)的网格,每个 ...

随机推荐

  1. Python小白的数学建模课-A1.国赛赛题类型分析

    分析赛题类型,才能有的放矢. 评论区留下邮箱地址,送你国奖论文分析 『Python小白的数学建模课 @ Youcans』 带你从数模小白成为国赛达人. 1. 数模竞赛国赛 A题类型分析 年份 题目 要 ...

  2. opencv——自适应阈值Canny边缘检测

    前言 Canny边缘检测速度很快,OpenCV中经常会用到Canny边缘检测,以前的Demo中使用Canny边缘检测都是自己手动修改高低阈值参数,最近正好要研究点小东西时,就想能不能做个自适应的阈值, ...

  3. springboot整合JDBC出现Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'.

    今天使用springboot整合JDBC的使用,开始使用的是 com.mysql.jdbc.Driver驱动 结果运行出现此异常 那我们根据提示要求来修改即可 把驱动改成最新的com.mysql.cj ...

  4. docker启动失败如何查看容器日志

    docker启动失败如何查看容器日志 在使用docker的时候,在某些未知的情况下可能启动了容器,但是过了没几秒容器自动退出了.这个时候如何排查问题呢? 通常碰到这种情况无非就是环境有问题或者应用有问 ...

  5. Go string 详解

    前言 字符串(string) 作为 go 语言的基本数据类型,在开发中必不可少,我们务必深入学习一下,做到一清二楚. 本文假设读者已经知道切片(slice)的使用,如不了解,可阅读 Go 切片 基本知 ...

  6. GPU与显卡

    GPU与显卡 一.什么是GPU? GPU这个概念是由Nvidia公司于1999年提出的.GPU是显卡上的一块芯片,就像CPU是主板上的一块芯片.那么1999年之前显卡上就没有GPU吗?当然有,只不过那 ...

  7. 基于TensorRT的BERT实时自然语言理解(上)

    基于TensorRT的BERT实时自然语言理解(上) 大规模语言模型(LSLMs)如BERT.GPT-2和XL-Net为许多自然语言理解(NLU)任务带来了最先进的精准飞跃.自2018年10月发布以来 ...

  8. 编译器架构Compiler Architecture(下)

    编译器架构Compiler Architecture(下) Combining Scanning and Parsing 实际上没有必要将扫描(词法分析/标记化)与解析(语法分析/树生成)分开.基于P ...

  9. 开源电路分享のFalling Star Board

    设计初衷 想自己做个能连网的时钟,结合RT-thread,显示个天气预报什么的,想想就挺有趣的.考虑到当前的芯片价格,和后续的设计,万一还有个啥奇妙的想法呢,就把这个做成了核心板. 一开始就只做了最小 ...

  10. 单点突破:MySQL之索引

    前言 开发环境:MySQL5.7.31 什么是索引 在MySQL中,索引(Index)是帮助高效获取数据的数据结构. 我们可以将数据库理解为一本书,数据库中的各个数据列(column)就是目录中的章节 ...