Codeforces 777 题目研讨
题目连接
题目分析
A
难度:普及−
题面翻译:
给你三张牌:\(0\),\(1\),\(2\)。
最初选一张,然后依次进行 \(n\) 次交换,交换规则为:中间一张和左边的一张,中间一张和右边一张,中间一张和左边一张……
最后问选的那张在哪个位置。
算法标签:模拟、枚举、构造、数学
题解:
注意到每 \(6\) 次操作为一个周期,在经过一周期后序列被还原成操作前的形态。因此打个表然后直接做就做完了。
B
难度:普及−
题面翻译:
有两个人 S 和 M,他们每人有一段长度为 \(N\) 的数字,两个人在每一轮游戏中都可以按顺序拿出一个数字,谁的数字小谁就接受一次惩罚。若相等两者都没有惩罚。另外,M 可以重新安排自己数字的顺序,问 M 的最少被惩罚次数和 S 的最多被惩罚次数是多少。
算法标签:博弈论、数据结构、贪心、排序
题解:
先排个序。
根据一篇著名的博弈论论文\(^{[1]}\),有以下策略:
- 若此轮能赢,则使用最小的能赢下来的牌。
- 若此轮不能赢,则出当前最小的牌。
证明在原论文内,此处略。
设 S 的牌为 \(s_i\),M 的牌为 \(m_i\)。显然,对于第一问,只要 \(s_i \ge m_i\) 就能出 \(m_i\) 这张牌。
而对于第二问,出牌条件改为 \(s_i>m_i\) 即可。
C
难度:普及+/提高
题面翻译:
给出一个 \(n\times m\) 的矩阵。对于第 \(j\) 列,如果满足 \(\forall i \in [1,n-1],a_{i,j} \leq a_{i+1,j}\),则称这一列是不下降的。
\(k\) 次询问,问如果只保留矩阵的第 \(L\)~\(R\) 行,矩阵中是否存在不下降的一列。
算法标签:二分、数据结构、动态规划、贪心、双指针
题解:
注意到本题和最长不下降子串有关。用 \(b_{i,j}\) 表示以 \(a_{i, j}\) 结尾的最长不下降子串起始位置的下标(注意不是长度),然后预处理出每一行最小的 \(b\) 即可在 \(O(1)\) 内查询。
D
难度:普及+/提高
题面翻译:
给出 \(n\) 个开头是
#的字符串,你需要通过操作使这些字符串按字典序从小到大排列。
每次操作,你可以把某一个字符串的任意后缀去掉(当然你甚至可以去掉整个字符串),要求你去掉的字符数量最少。
输出你操作完的这 \(n\) 个字符串。
算法标签:二分、贪心、字符串
题解:
不难发现,本题和排序没有任何关系。
注意到去除后缀会使字符串的字典序变小,因此 \(s_n\) 不需要变化。而对于 \(s_i(1\le i\le n-1)\),可以贪心的操作,使其刚好小于等于 \(s_{i+1}\)。因此从后往前操作即可。
E
难度:提高+/省选−
题面翻译:
给出 \(n\) 个环形零件的厚度、内径、外径,要求按以下条件装配若干圆盘后,形成的塔最高。
- 圆盘应平放。也就是说,对于每个安放的零件,侧视图应当为长方形,而俯视图应为圆环。
- 圆盘应叠放,而下方的圆盘外径应大于等于上方圆盘的外径。
- 上方圆盘的外径应严格大于下方圆盘的内径(否则上方圆盘会因重力作用掉到下方圆盘的孔里)。
算法标签:枚举、排序
题解:
这道题和最长上升子序列有点像。先按照 \(b_i\) 降序对圆环排序,方便转移。
设 \(\text{dp}_i\) 为以 \(i\) 为顶的最大塔高,则有转移:
\]
。于是你 T 了。
因此考虑引入堆优化。将先前的状态压入大根堆中(按 \(h\) 排序),直接弹出 \(a \ge b_i\) 的栈顶(因为此时堆顶不合法,接下来堆顶一定更不合法),直到合法,然后更新答案即可。
时间复杂度 \(O(n\text{log}{n})\),可以通过。
#include <bits/stdc++.h>
using namespace std;
#define int long long
struct dat {
int a, b, h;
} ring[100010];
int n, dp[100010];
bool cmp(dat a, dat b) {
if (a.b != b.b) return a.b > b.b;
return a.a > b.a;
}
bool operator < (dat x, dat y) { return x.h < y.h; }
priority_queue<dat> q;
signed main() {
scanf("%lld", &n);
for (int i = 1; i <= n; i++) {
scanf("%lld%lld%lld", &ring[i].a, &ring[i].b, &ring[i].h);
}
sort(ring + 1, ring + n + 1, cmp);
q.push({0, 0, 0});
long long ans = 0;
for (int i = 1; i <= n; i++) {
while (q.top().a >= ring[i].b) q.pop();
dp[i] = q.top().h + ring[i].h;
q.push({ring[i].a, ring[i].b, q.top().h + ring[i].h});
ans = max(ans, dp[i]);
}
printf("%lld\n", ans);
return 0;
}
总结
这套题在 Codeforces 中属于较简单水平,有希望考场 AK(只是有希望)。
Codeforces 777 题目研讨的更多相关文章
- BUPT2017 springtraining(16) #1 ——近期codeforces简单题目回顾
这里是contest 8道题全部来源于 cf 的两场contest (出题人可真懒啊 Codeforces Round #411 (Div. 2)的ABCDE Codeforces Round #40 ...
- Codeforces 划水
Codeforces 566F 题目大意:给定$N$个数,任意两个数之间若存在一个数为另一个数的因数,那么这两个数存在边,求图中最大团. 分析:求一个图最大团为NP-Hard问题,一般不采用硬方法算. ...
- Codeforces Round# 305 (Div 1)
[Codeforces 547A] #include <bits/stdc++.h> #define maxn 1000010 using namespace std; typedef l ...
- codeforces 577
codeforces 577A 题目链接:http://codeforces.com/problemset/problem/577/A 题目大意:给出一个n*n的表格,每个表格对应的值为横坐标*纵坐标 ...
- Codeforces Round #144 (Div. 2) D table
CodeForces - 233D 题目大意给你一个n*m 的矩阵,要求你进行涂色,保证每个n*n的矩阵内都有k个点被涂色. 问你一共有多少种涂色方案. n<=100 && m& ...
- Codeforces 675E Trains and Statistic - 线段树 - 动态规划
题目传送门 快速的vjudge通道 快速的Codeforces通道 题目大意 有$n$个火车站,第$i$个火车站出售第$i + 1$到第$a_{i}$个火车站的车票,特殊地,第$n$个火车站不出售车票 ...
- Consecutive Subsequence CodeForces - 977F(dp)
Consecutive Subsequence CodeForces - 977F 题目大意:输出一序列中的最大的连续数列的长度和与其对应的下标(连续是指 7 8 9这样的数列) 解题思路: 状态:把 ...
- codeforces Round#429 (Div2)
2017-08-20 10:00:37 writer:pprp 用头文件#include <bits/stdc++.h>很方便 A. Generous Kefa codeforces 84 ...
- Codeforces 474D Flowers 动态规划法
话说好久没写算法代码了,工作了有点忙的了.只是算法始终是我的挚爱,故此还是尽量抽时间和挚爱来个约会. Codeforces的题目是最适合练手的了,以下是一道不算难的动态规划法题目.先上题: D. Fl ...
- CodeForces - 906D Power Tower(欧拉降幂定理)
Power Tower CodeForces - 906D 题目大意:有N个数字,然后给你q个区间,要你求每一个区间中所有的数字从左到右依次垒起来的次方的幂对m取模之后的数字是多少. 用到一个新知识, ...
随机推荐
- freertos学习笔记(十一)直接任务通知
直接任务通知 起源 队列和信号量是实时操作系统的典型功能,而FreeRTOS提供的直接任务通知比队列和信号量更小且速度更快(快45%) 开发人员应优先使用量身定制的功能:直接任务通知.消息缓冲区和流缓 ...
- 使用 Portainer CE 管理 Docker
此文档参考官方文档 Install Portainer CE with Docker on Linux 编写. 创建容器 docker volume create portainer_data 启动 ...
- .NET Core搭配Vue开源弹幕效果,实现一个评论小项目。好玩!
ZY树洞 前言 ZY树洞是一个基于.NET Core开发的简单的评论系统,主要用于大家分享自己心中的感悟.经验.心得.想法等. 好了,不卖关子了,这个项目其实是上班无聊的时候写的,为什么要写这个项目呢 ...
- 终于有人把Modbus讲明白了
大家好!我是付工. 2012年开始接触Modbus协议,至今已经有10多年了,从开始的懵懂,到后来的顿悟,再到现在的开悟,它始终岿然不动,变化的是我对它的认知和理解. 今天跟大家聊聊关于Modbus协 ...
- [rCore学习笔记 026]第三章作业
写在前面 本随笔是非常菜的菜鸡写的.如有问题请及时提出. 可以联系:1160712160@qq.com GitHhub:https://github.com/WindDevil (目前啥也没有 编程题 ...
- Qml 实现星级评分组件 已发布
[写在前面] 在现代应用程序中,星级评分是一个常见的用户界面元素,它允许用户对产品.服务或内容进行评价. 想必大家在用各种带有评分的软件中看到过这个组件: 本文将指导你如何使用 Qml 创建一个简单而 ...
- Servlet——xml配置Servlet
XML配置方式编写 Servlet 步骤: 1.编写 Servlet 类 2.在 web.xml 中配置该Servlet
- QT原理与源码分析之对象级QT事件过滤器
本文简略介绍了QT原理与源码分析中的QT对象级事件过滤器的自定义过滤函数.对象级事件过滤器的安装过程,以及安装函数的源码实现. 自定义QT事件过滤器的过滤函数的实现: 事件过滤器被调用时执行的函数代码 ...
- 一,初始 MyBatis-Plus
一,初始 MyBatis-Plus @ 目录 一,初始 MyBatis-Plus 1. MyBatis-Plus 的概述 2. 入门配置第一个 MyBatis-Plus 案例 3. 补充说明: 3.1 ...
- 暑假集训CSP提高模拟1
A.Start 比较小的大模拟,还没改出来 B.mine 线性推一下(这个题记搜容易写偏,因为分讨太多) 设 \(f[i][j]\),第一维表示位置,第二位表示末位状态(是雷,是 \(0\),是 \( ...