这题真的想了挺久的,然而到最后也还是没想到怎样处理环的情况……网上竟然也完全没有题解,无奈之下到 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相关推荐

  1. 题解 CF 1413B A New Technique

    原题 题面简化 TTT 组数据 用 nnn 行.mmm 列的不重数字按输入顺序组成一个矩阵 数据范围 1≤T≤1000001≤T≤1000001≤T≤100000 1≤n,m≤5001≤n,m≤500 ...

  2. codeforces 713 C. Sonya and Problem Wihtout a Legend

    题目来源:传送门 题意把序列转化为严格递增,问最小操作数.与poj3666类似,唯一不同于是严格递增是非严格递增.(若对poj3666有疑问可点击此处:click) 而严格递增可以转为为非严格递增. ...

  3. [题解]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 思路 从 ...

  4. CF 1742C 题解 P8557 炼金术(Alchemy) 题解

    温馨提示:\color{#E74C3C}\text{温馨提示:}温馨提示: 遇见题解勿抄袭,棕名封号两行泪.\color{#E74C3C}\text{遇见题解勿抄袭,棕名封号两行泪.}遇见题解勿抄袭, ...

  5. ZJOI2018游记Round1

    广告 ZJOI2018Round2游记 All Falls Down 非常感谢学弟学妹们捧场游记虽然这是一篇假游记 ZJOI Round1今天正式落下帷幕.在这过去的三天里遇到了很多朋友,见识了很多有 ...

  6. 【基础编程题目集编程题及其答案】

    python江湖 7-1 厘米换算英尺英寸~15 题解: 7-2 然后是几点~15 题解: 7-3 逆序的三位数~10 题解: BCD解密~10 题解: 7-5 表格输出~5 题解: 7-6 混合类型 ...

  7. codeforce 332B Maximum Absurdity

    原题链接 题意 一个长为N的序列,选择其中2个长为K的不相交区间,使两个区间和最大 题解 CF标签上写的好好的DP,做着做着发现就是前缀和思想嘛,哪里有DP?哪里有DP? #include<bi ...

  8. 2016区域赛前冲刺训练

    UPD 2016.10.23 shift-and (2题) Codeforces 训练 现在已经完成了: 191 [Codeforces Round #377] (6/6) Div 2 A Buy a ...

  9. 2020-12-02 Centos8.2邮件服务器搭建攻略!一文吃透Postfix+Dovecot+MySQL!

    1.jpg 今天来聊聊Linux邮件服务器的搭建,本以为这不是一件很困难的事情,毕竟电子邮件这种高度成熟的技术应该有很容易部属吧,上手后才发现原来坑还真不少.本方案以主流的postfix + dova ...

  10. android网络编程_Android上的网络编程

    android网络编程 This article is a short foray into how I setup my development environment in on an Andro ...

最新文章

  1. 探究rh6上mysql5.6的主从、半同步、GTID多线程、SSL认证主从复制
  2. Yann LeCun等最新研究:如何对未来实例分割进行预测?
  3. 算法学习:常用排序方法
  4. poj2104(划分树模板)
  5. 深究AngularJS——ui-router详解
  6. 笔记-中项案例题-2021年上-人力资源管理和沟通管理
  7. wget命令---Linux学习笔记
  8. python闭环最短路径_深度学习经典算法 | 蚁群算法解析
  9. luogu1168 中位数
  10. hive学习08天-一次hvie面试题
  11. 程序员编程,你的练习是不是有效的?
  12. matlab转dsp软件,matlab/simulink程序代写 DSP程序开发
  13. [视频]MAC中如何单独放大文本字体
  14. linux驱动之poll/select轮询机制实例分析(结合驱动中断使用)
  15. 在网页中使用超链接来打开本地应用(可传参数)
  16. 02-即时通讯-XMPP 简单介绍
  17. python xlwt写excel_Python使用xlwt写excel并设置写入格式
  18. 网上流传房地产崩盘时间表 楼市重蹈日本覆辙 - 新闻中心 - 搜狐焦点网
  19. 巴东县黄土坡滑坡GNSS自动化位移监测解决方案
  20. 关于matlab中help无法使用的解决办法(点开后是空白)

热门文章

  1. go语言阶段综合练习--家庭收支软件的示例--过程版本
  2. java编程语言的常用快捷方式
  3. python文件路径的操作
  4. android 7.0添加菜单,Android 7.0 settings中添加/删除菜单
  5. 下列哪种不是python元组的定义方式_python笔试题
  6. 湖科大计算机科学与技术,湖南科技大学计算机科学与工程学院前来我院进行访问与交流...
  7. 接口自动化-接口测试初介
  8. 汤立波:车联网最新发展动态
  9. C# 操作IIS方法集合
  10. sysV init服务脚本(入门级)