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. WEB安全防护相关响应头(上)

    WEB 安全攻防是个庞大的话题,有各种不同角度的探讨和实践.即使只讨论防护的对象,也有诸多不同的方向,包括但不限于:WEB 服务器.数据库.业务逻辑.敏感数据等等.除了这些我们惯常关注的方面,WEB ...

  2. 支持边云协同终身学习特性,KubeEdge子项目Sedna 0.3.0版本发布!

    摘要:随着边缘设备数量指数级增长以及设备性能的提升,边云协同机器学习应运而生,以期打通机器学习的最后一公里. 本文分享自华为云社区<支持边云协同终身学习特性,KubeEdge子项目Sedna 0 ...

  3. python批量向kafka塞数据

    python批量向kafka塞数据 from kafka import KafkaClient from kafka.producer import SimpleProducer from kafka ...

  4. RGB-D对红外热像仪和毫米波雷达标定

    RGB-D对红外热像仪和毫米波雷达标定 Extrinsic Calibration of Thermal IR Camera and mmWave Radar by Exploiting Depth ...

  5. MindSpore基本原理

    MindSpore基本原理 MindSpore介绍 自动微分 自动并行 安装 pip方式安装 源码编译方式安装 Docker镜像 快速入门 文档 MindSpore介绍 MindSpore是一种适用于 ...

  6. 使用js获取checkbox控件在GridView中的第几行

    这次的知识点是如何使用js获取checkbox控件所在的是第几行!!! 我们可以使用 JavaScript 中自带的 rowIndex 和 cellIndex 来获取行和列的键值 (从0开始) 这两个 ...

  7. vue3函数setUp和reactive函数详细讲解

    1 setUp的执行时机 我们都知道,现在vue3是可以正常去使用methods的. 但是我们却不可以在setUp中去调用methods中的方法. 为什么了??? 我们先了解一下下面这两个生命周期函数 ...

  8. 源码简析Spring-Integration执行过程

    一,前言 Spring-Integration基于Spring,在应用程序中启用了轻量级消息传递,并支持通过声明式适配器与外部系统集成.这一段官网的介绍,概况了整个Integration的用途.个人感 ...

  9. 读HikariCP源码学Java(二)—— 因地制宜的改装版ArrayList:FastList

    前言 如前文所述,HikariCP为了提高性能不遗余力,其中一个比较特别的优化是它没有直接使用ArrayList,而是自己实现了FastList,因地制宜,让数组的读写性能都有了一定程度的提高. 构造 ...

  10. 【C++】类

    一个简单例子: 1 //c++ 类 2 #include<iostream> 3 using namespace std; 4 class Point 5 { 6 private: 7 i ...