CodeTON Round 2 (Div. 1 + Div. 2, Rated, Prizes!) A-E
A
题解
知识点:思维,模拟。
发现 \(b\) 串第一个字符是 \(1\) 则只能使用 max , \(0\) 则只能使用 min ,随后只需要模拟到 \(a\) 串剩余 \(m\) 个字符时停止即可,然后比对两串。
时间复杂度 \(O(n-m)\)
空间复杂度 \(O(n+m)\)
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
bool solve() {
int n, m;
cin >> n >> m;
string a, b;
cin >> a >> b;
if (b[0] == '0') for (int i = 1;i <= n - m;i++) a[i] = min(a[i], a[i - 1]);
else if (b[0] == '1') for (int i = 1;i <= n - m;i++) a[i] = max(a[i], a[i - 1]);
if (a.substr(n - m, m) == b) return true;
else return false;
}
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';
else cout << "YES" << '\n';
}
return 0;
}
B
题解
知识点:贪心。
一个一个走过去,记录走过的最大值和最小值,一旦大于两倍 \(x\) 则说明要换中心点 \(v\) ,记录换的次数即可。
时间复杂度 \(O(n)\)
空间复杂度 \(O(n)\)
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
bool solve() {
int n, x;
cin >> n >> x;
int mi = 2e9, mx = 0, cnt = 0;
for (int i = 1, tmp;i <= n;i++) {
cin >> tmp;
mi = min(mi, tmp);
mx = max(mx, tmp);
if (mx - mi > 2 * x) cnt++, mx = mi = tmp;
}
cout << 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
题解
知识点:贪心。
注意到所有非感染者区间每秒都会被感染两个(从左右端点扩展,少于两个直接消失),因此考虑从大区间端点开始保护,每次更新 \(delta\) 代表每个区间减少了多少,则真实区间长度是原长减去 \(delta\)。
因此若真实区间大于等于2,则在两个端点各保护一个,答案加区间长度减一(一个端点保护完,另一个端点会感染一个),\(delta\) 加 \(4\);若区间长度等于1,则只能保护一个,直接退出;若区间已经小于等于0,没有能保护的,直接退出。
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int a[100007], l[100007];
bool solve() {
int n, m;
cin >> n >> m;
for (int i = 1;i <= m;i++) cin >> a[i];
sort(a + 1, a + 1 + m);
l[1] = n - (a[m] - a[1] + 1);
for (int i = 2;i <= m;i++) l[i] = a[i] - a[i - 1] - 1;
sort(l + 1, l + m + 1, [&](int a, int b) {return a > b;});
int delta = 0, ans = 0;
for (int i = 1;i <= m;i++) {
int rl = max(l[i] - delta, 0);
if (rl == 0) break;
if (rl == 1) {
ans++;
break;
}
ans += rl - 1;
delta += 4;
}
cout << n - 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
题解
知识点:枚举,前缀和,思维。
通常这种题是找不变量。
发现经过操作1以后,前缀和的总和不变;而经过一次操作2后,前缀和的总和会减少1。
因此统计每个数组的前缀和总和,找到前缀和总和最小的就是特殊数组,少了多少就是操作了多少次。
时间复杂度 \(O(nm)\)
空间复杂度 \(O(n)\)
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll ssum[100007];
bool solve() {
int n, m;
cin >> n >> m;
for (int i = 1;i <= n;i++) {
ll sum = 0;
ssum[i] = 0;
for (int j = 1;j <= m;j++) {
ll x;
cin >> x;
sum += x;
ssum[i] += sum;
}
}
cout << min_element(ssum + 1, ssum + n + 1) - ssum << ' ';
cout << *max_element(ssum + 1, ssum + n + 1) - *min_element(ssum + 1, ssum + n + 1) << '\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
题解
知识点:图论,dp。
题目不难理解为,每秒所有点都会流出一个量到所有自己的下一个点,什么时候流完。比如,若 \(u\) 有三个下一个节点 \(v_1,v_2,v_3\) ,则一秒后 \(u\) 的值减一,而 \(v_1,v_2,v_3\) 都加一。
因为是DAG,所以图中每个点的量总是向出度为 \(0\) 的节点方向流动,最终出度为 \(0\) 的点的流完时间就是答案。
而对于一个节点的流完时间,取决于他所有上一个节点流完时间的总和加上自己节点的量,因为一个节点每秒只能流出一个量,只要上一个节点没流完,那这个节点就会一直存在量。因此,设 \(dp[i]\) 为编号 \(i\) 的节点的流出时间,则节点 \(u\) 与其上一个节点 \(v_i\) 有转移方程:
\]
但是有一种情况,如 10-0-1-0-0-null ,显然流完时间是 \(14\) ,但通过上面计算得到的是 \(11\) 。因为上述方程直接考虑从第一秒到最后一秒,整个图的量的转移是连续的,即量是持续减少,而没有考虑中间可能存在断点,但显然这是不确定的,这个例子就是。
因此需要使整个图的量堆积在出口前,使得量的流出是连续的。由于整个图有 \(n\) 个节点,至多 \(n-1\) 秒可以让量流经图中所有点(这里模拟 \(\geq n-1\) 秒都没问题),因此先模拟 \(n\) 秒,等到量都连起来了,再dp计算总时间即可。
模拟时候用正图,dfs时候反图,因此存两个图。
时间复杂度 \(O(n^2m)\)
空间复杂度 \(O(n+m)\)
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int mod = 998244353;
vector<int> a, dp;
vector<int> g1[1007], g2[1007]; ///g1正向模拟用,g2反向dfs用
int dfs(int u) {
if (dp[u]) return dp[u];
dp[u] = a[u] % mod;
for (auto v : g2[u])
dp[u] = (0LL + dp[u] + dfs(v)) % mod;
return dp[u];
}
bool solve() {
int n, m;
cin >> n >> m;
a = dp = vector<int>(n + 1, 0);
for (int i = 1;i <= n;i++) cin >> a[i], g1[i].clear(), g2[i].clear();
for (int i = 1;i <= m;i++) {
int u, v;
cin >> u >> v;
g1[u].push_back(v);
g2[v].push_back(u);
}
if (count(a.begin() + 1, a.end(), 0) == n) {
cout << 0 << '\n';
return true;
}
for (int i = 1;i <= n;i++) {///保证所有量都在出口前靠拢,防止空节点挡在其他节点之前产生计算错误
vector<int> t = a;///临时,防止某个量持续传递
for (int u = 1;u <= n;u++) {
if (a[u]) {
t[u]--;
for (auto v : g1[u]) t[v]++;
}
}
a = t;
if (count(a.begin() + 1, a.end(), 0) == n) {
cout << i << '\n';
return true;
}
}
int root = 0;
for (int i = 1;i <= n;i++) if (!g1[i].size()) root = i;
cout << (dfs(root) + n) % mod << '\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;
}
CodeTON Round 2 (Div. 1 + Div. 2, Rated, Prizes!) A-E的更多相关文章
- Codeforces 1023 A.Single Wildcard Pattern Matching-匹配字符 (Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Fi)
Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final) A. Single Wildcard Patter ...
- CF Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined)
1. Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) B. Batch Sort 暴力枚举,水 1.题意:n*m的数组, ...
- Codeforces Beta Round #27 (Codeforces format, Div. 2)
Codeforces Beta Round #27 (Codeforces format, Div. 2) http://codeforces.com/contest/27 A #include< ...
- Codeforces Round #438 (Div.1+Div.2) 总结
本来兴致勃勃的想乘着这一次上紫,于是很早很早的到了机房 但是好像并没有什么用,反而rating-=47 Codeforces Round #438(Div.1+Div.2) 今天就这样匆匆的总结一下, ...
- Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2)-D. Restore Permutation-构造+树状数组
Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2)-D. Restore Permutation-构造+树状数组 [Pro ...
- Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2)-C. Magic Grid-构造
Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2)-C. Magic Grid-构造 [Problem Descripti ...
- Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2)-E. Let Them Slide-思维+数据结构
Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2)-E. Let Them Slide-思维+数据结构 [Problem ...
- Codeforces Round #792 (Div. 1 + Div. 2) A-E
Codeforces Round #792 (Div. 1 + Div. 2) A-E A 题目 https://codeforces.com/contest/1684/problem/A 题解 思路 ...
- Codeforces Round #792 (Div. 1 + Div. 2) // C ~ E
比赛链接:Dashboard - Codeforces Round #792 (Div. 1 + Div. 2) - Codeforces C. Column Swapping 题意: 给定一个n*m ...
- 【codeforces】【比赛题解】#868 CF Round #438 (Div.1+Div.2)
这次是Div.1+Div.2,所以有7题. 因为时间较早,而且正好赶上训练,所以机房开黑做. 然而我们都只做了3题.:(. 链接. [A]声控解锁 题意: Arkady的宠物狗Mu-mu有一只手机.它 ...
随机推荐
- SpringBoot Redis 实践指南
前言 SpringBoot Cache 是一个很好的缓存框架,可以兼容多种缓存实现,数据量较大的情况下,Redis 应该是最多被使用的. 本文重点介绍 SpringBoot 和 Redis 整合使用的 ...
- JavaScript数组常用方法解析和深层次js数组扁平化
前言 数组作为在开发中常用的集合,除了for循环遍历以外,还有很多内置对象的方法,包括map,以及数组筛选元素filter等. 注:文章结尾处附深层次数组扁平化方法操作. 作为引用数据类型的一种,在处 ...
- Cocos---简单案例:红气球
红气球 知识点 场景切换 动画播放,帧事件,Tween 按钮控件 音效管理 案例介绍 开始界面 点击按钮自动进入游戏界面 游戏界面 游戏目的找出红气球,如果点击红气球意味着游戏成功,其余意味着游戏失败 ...
- 什么是请求参数、表单参数、url参数、header参数、Cookie参数?一文讲懂
最近在工作中对 http 的请求参数解析有了进一步的认识,写个小短文记录一下. 回顾下自己的情况,大概就是:有点点网络及编程基础,只需要加深一点点对 HTTP 协议的理解就能弄明白了. 先分享一个小故 ...
- Java类包
学习内容:Java类包 一.Java类包 1.一个完整的类名需要包名和类名的组合,每一个类都隶属于一个包. 例:完整类名--java.sql.Date 2.同一个包中类相互访问时可以不指明包名. 3. ...
- Proxmox 7.2 部署 DoraCloud桌面云,支持vGPU
介绍 本文介绍了使用Proxmox + DoraCloud,将一台图形工作站(配置有Tesla P4显卡)改造成一台桌面云主机.可以满足多个桌面用户同时使用3D应用的需求. 该方案适合于小型工作室.电 ...
- 【单片机】CH32V103v8t6 - PA5-外部中断测试程序
main.c文件内容 /* *@Note 外部中断线例程: EXTI_Line5(PA5) PA5设置上拉输入,下降沿触发中断. */ #include "debug.h" /** ...
- 深度学习与CV教程(2) | 图像分类与机器学习基础
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/37 本文地址:http://www.showmeai.tech/article-det ...
- MySQL锁(乐观锁、悲观锁、多粒度锁)
锁 并发事务可能出现的情况: 读-读事务并发:此时是没有问题的,读操作不会对记录又任何影响. 写-写事务并发:并发事务相继对相同的记录做出改动,因为写-写并发可能会产生脏写的情况,但是没有一个隔离级别 ...
- 大功率超远距离lora无线数传电台,多级中继功能
一.在无线通信领域,LoRa是目前市场最被看好的技术之一.随着新一代LoRa调制技术的升级,市场对LoRa技术的认知.认可逐步提高,基于LoRa调制技术开发的产品得到更广泛的应用.受益于其超低的接收灵 ...