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有一只手机.它 ...
随机推荐
- maven install resources failed: newPosition < 0: (-1 < 0)
添加以下代码在 pom.xml 中,具体参阅这里 <build> <plugins> <plugin> <groupId>org.apache.mave ...
- MySQL主从配置及haproxy和keepalived搭建
本篇文章主要介绍如何搭建MySQL主主配置.主从配置.haproxy.keepalived,已经搭建过程中的一些问题.本次运行环境是在docker中,也会介绍一些docker的知识 docker 小知 ...
- Linux用户权限集中管理方案
一.问题 服务器多,各个服务器上的管理人员多,ROOT权限泛滥,经常导致文件莫名其妙丢失,老手和新手对服务器的熟知程度不同,安全存在不稳定和操作安全隐患. 二.方案 利用sudo配置指定用户只能执行指 ...
- HTML表格以及表单
学习内容: 1.HTML表格 代码实例: <%@ page language="java" import="java.util.*" pageEncodi ...
- mysql外键与表查询
目录 自增特性 外键 外键关系 外键创建 外键的约束效果 级联更新级联删除 多对多关系 一对一关系 表查询关键字 select与from where筛选 group by分组 练习 关系练习 查询练习 ...
- bind-utils-测试域名解析
bind-utils是一个网络管理类工具集,其集成了我们常用的命令"nslookup",我们可以使用诊断域名解析情况. 1.安装bind-utils [root@localhost ...
- 【可视化分析案例】用python分析B站Top100排行榜数据
一.数据源 之前,我分享过一期爬虫,用python爬取Top100排行榜: 最终数据结果,是这样的: 在此数据基础上,做python可视化分析. 二.数据读取 首先,读取数据源: # 读取csv数据 ...
- 代码模板整理(0):先水一波a+b
梦开始的地方 "Hello World!" #include<bits/stdc++.h> using namespace std; int main(){ cout& ...
- LoRa模块无线收发通信技术详解
LoRa是一种LPWAN通信技术,它基于扩频技术而广泛应用于超长距离的无线传输场景中.现在,LoRa主要在全世界433.868.915MHz等自由频带工作.其最大特征是灵敏度高,传输距离长,工作功耗低 ...
- Ubuntu远程桌面助手(URDC)
目前自动驾驶域控制器项目中使用了英伟达的Orin芯片+Ubuntu20.04系统.域控属于典型的Headless设备,开发调试时需要连接显示器(HDMI/DP).鼠标和键盘,或者使用NoMachine ...