【题解】CF#713 E-Sonya Partymaker
这题真的想了挺久的,然而到最后也还是没想到怎样处理环的情况……网上竟然也完全没有题解,无奈之下到 CF 的 AC 代码里面去找了一份膜拜了一下。感谢~
由于觉得这题有一定的难度,自己看代码也看了比较久才理解,就记录一下吧……
首先,不难发现一个人一定不会往返走。因为一个人之所以要往回走,理由一定是因为碰到了已经访问过的凳子(与他人的路径相撞)。我们不妨看作是这两个人灵魂交换,即两人均继续向前,而不往返。所以问题转化为在一个环上指定 n 个点,从每个点可以顺 \ 逆时针延伸出一条长为 x 的线段,问能覆盖整个环的最小 x 值。
显然需要二分一下。如果这个问题是在序列上的问题,我们可以 dp。设立 dp 状态 f[i][0 / 1] 表示第 i 号节点是向左 / 向右的线段,所能从起点开始连续访问的最远地点是多少。这样好像有个 bug :可以有下图中的情况出现,即第 i - 1 到第 i 号节点之间的位置由第 i + 1 号节点来覆盖。但这样没有关系,因为我们可以在 dp 到 i + 1 的位置的时候填补起 i ~ i - 1 之间的位置,并把答案更新为第 i 号节点向前延伸出来的部分。
如果不够清晰,可以看一下代码中的转移方程。
最难处理的就是这一个环。因为有可能第 1 号节点和第 2 号节点之间的这一段是由第 n 号节点来覆盖的。可是这样根据我们的定义,我们将一直无法更新 dp 数组。为了避免这样的一种情况,我们可以选择破环为链。断开哪一条边呢?选择断开最长的一条边,因为这条边就是答案的上界,也就是指这样断开的链上 n 号节点永远不会选择通过这条边来覆盖 1~2 之间的这一段。然后我们就只需要分类讨论一下 1 号节点是向左还是向右就可以了。
**启示:其实这种破环为链的题目见得很多了,但还是没有做出来,是我太菜了……应该找到在环上必然不会有影响的一条边去分割成链,如51nod部落信号。
代码(kuai的...):
#include <bits/stdc++.h> using namespace std; #define maxn 1000000 #define int long long #define INF 99999999999LL int n, m, f[maxn][2], P[maxn], p[maxn]; int ans, mx, pos; int read() {int x = 0, k = 1;char c; c = getchar();while(c < '0' || c > '9') { if(c == '-') k = -1; c = getchar(); }while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();return x * k; }bool Check(int x) {for(int j = 0; j <= 1; j ++){f[1][0] = j ? -INF : 0; f[1][1] = j ? x : -INF;if(j){if(x + 1 >= P[2]) f[2][0] = max(P[1] + x, P[2]);else f[2][0] = -INF;}for(int i = j + 2; i <= n; i ++){f[i][0] = f[i][1] = max(f[i - 1][0], f[i - 1][1]);if(max(f[i - 1][1], f[i - 1][0]) + 1 >= P[i]) f[i][1] = P[i] + x;if(P[i] - x - 1 <= f[i - 1][0]) f[i][0] = max(f[i - 1][0], P[i]);if(P[i] - x - 1 <= f[i - 1][1]) f[i][0] = max(f[i - 1][1], max(P[i], P[i - 1] + x));}int t = max(f[n][0], f[n][1]);if(j && t + 1 >= P[2] + m - x) return 1;else if(!j && t + 1 >= m - x) return 1;}return 0; }signed main() {m = read(), n = read();if(n == 1) { printf("%I64d\n", m - 1); return 0; } for(int i = 1; i <= n; i ++) p[i] = read();for(int i = 1; i <= n; i ++){int dis; dis = p[i] - p[i - 1];if(i == 1) dis = p[i] + m - p[n];if(dis > mx) mx = dis, pos = i;}for(int i = 1; i <= n; i ++){int t = i - 1 + pos; if(t > n) t -= n;P[i] = p[t]; P[i] -= p[pos];if(P[i] < 0) P[i] += m;}int l = 0, r = m - 1;while(l <= r){int mid = (l + r) >> 1;if(Check(mid)) ans = mid, r = mid - 1;else l = mid + 1;}printf("%I64d\n", ans);return 0; }
转载于:https://www.cnblogs.com/twilight-sx/p/9930132.html
【题解】CF#713 E-Sonya Partymaker相关推荐
- 题解 CF 1413B A New Technique
原题 题面简化 TTT 组数据 用 nnn 行.mmm 列的不重数字按输入顺序组成一个矩阵 数据范围 1≤T≤1000001≤T≤1000001≤T≤100000 1≤n,m≤5001≤n,m≤500 ...
- codeforces 713 C. Sonya and Problem Wihtout a Legend
题目来源:传送门 题意把序列转化为严格递增,问最小操作数.与poj3666类似,唯一不同于是严格递增是非严格递增.(若对poj3666有疑问可点击此处:click) 而严格递增可以转为为非严格递增. ...
- [题解]CF Round #386 (Div.2)
747A:Display Size 题意简述 给你 n n,求一对x,yx,y使得 x∗y=n x \ast y=n并且 x,y x,y最接近. 数据范围 n≤106 n \leq 10^6 思路 从 ...
- CF 1742C 题解 P8557 炼金术(Alchemy) 题解
温馨提示:\color{#E74C3C}\text{温馨提示:}温馨提示: 遇见题解勿抄袭,棕名封号两行泪.\color{#E74C3C}\text{遇见题解勿抄袭,棕名封号两行泪.}遇见题解勿抄袭, ...
- ZJOI2018游记Round1
广告 ZJOI2018Round2游记 All Falls Down 非常感谢学弟学妹们捧场游记虽然这是一篇假游记 ZJOI Round1今天正式落下帷幕.在这过去的三天里遇到了很多朋友,见识了很多有 ...
- 【基础编程题目集编程题及其答案】
python江湖 7-1 厘米换算英尺英寸~15 题解: 7-2 然后是几点~15 题解: 7-3 逆序的三位数~10 题解: BCD解密~10 题解: 7-5 表格输出~5 题解: 7-6 混合类型 ...
- codeforce 332B Maximum Absurdity
原题链接 题意 一个长为N的序列,选择其中2个长为K的不相交区间,使两个区间和最大 题解 CF标签上写的好好的DP,做着做着发现就是前缀和思想嘛,哪里有DP?哪里有DP? #include<bi ...
- 2016区域赛前冲刺训练
UPD 2016.10.23 shift-and (2题) Codeforces 训练 现在已经完成了: 191 [Codeforces Round #377] (6/6) Div 2 A Buy a ...
- 2020-12-02 Centos8.2邮件服务器搭建攻略!一文吃透Postfix+Dovecot+MySQL!
1.jpg 今天来聊聊Linux邮件服务器的搭建,本以为这不是一件很困难的事情,毕竟电子邮件这种高度成熟的技术应该有很容易部属吧,上手后才发现原来坑还真不少.本方案以主流的postfix + dova ...
- android网络编程_Android上的网络编程
android网络编程 This article is a short foray into how I setup my development environment in on an Andro ...
最新文章
- 探究rh6上mysql5.6的主从、半同步、GTID多线程、SSL认证主从复制
- Yann LeCun等最新研究:如何对未来实例分割进行预测?
- 算法学习:常用排序方法
- poj2104(划分树模板)
- 深究AngularJS——ui-router详解
- 笔记-中项案例题-2021年上-人力资源管理和沟通管理
- wget命令---Linux学习笔记
- python闭环最短路径_深度学习经典算法 | 蚁群算法解析
- luogu1168 中位数
- hive学习08天-一次hvie面试题
- 程序员编程,你的练习是不是有效的?
- matlab转dsp软件,matlab/simulink程序代写 DSP程序开发
- [视频]MAC中如何单独放大文本字体
- linux驱动之poll/select轮询机制实例分析(结合驱动中断使用)
- 在网页中使用超链接来打开本地应用(可传参数)
- 02-即时通讯-XMPP 简单介绍
- python xlwt写excel_Python使用xlwt写excel并设置写入格式
- 网上流传房地产崩盘时间表 楼市重蹈日本覆辙 - 新闻中心 - 搜狐焦点网
- 巴东县黄土坡滑坡GNSS自动化位移监测解决方案
- 关于matlab中help无法使用的解决办法(点开后是空白)