11:30,过题。12:50,忘记做法。

吃饭时不该看未来日记的,Ynoj 害人不浅(确信)。

以上为个人吐槽。


题目大意

不知道题目翻译是个啥。。。但讨论区有大佬给出了精确的翻译。我改得符合题目背景一点放上来:

每一个羊有一个区间 \(l_i,r_i\) ,如果两只羊区间相交,我们称为两只羊“捆在一起”

现在,你需要重新排列 \(n\) 只羊,使“捆在一起”的羊之间的最大距离最小,输出方案

距离定义为两只羊中间的羊的数量(其实无所谓了,毕竟只要输出方案)

提示:注意一只羊可以和多只羊捆在一起。

做法

二分加贪心。

二分答案,问题变成了保证两个相交的羊之间距离不超过二分的答案 mid 。

不妨从小到大选择这个位置应该放哪一只羊,那么我们可以维护出一个数组 fin ,表示每只羊当前最远能放到的位置是哪里。

首先判断无解情况。设当前选择到了序列的位置 i ,我们统计出数组 finc,finc[j] 表示 fin 数组值在从 i 到 j 的羊的个数

显然,无解的情况就是 \(finc[j] > j-i+1\) 。证明:根据 fin 的定义,每次选择后,限制变多,fin 不会变大。如果大于,就不能将 fin 在 i~j 之间的羊塞进 \(j-i+1\) 个位置中。

然后我们考虑这个位置放哪只羊。根据无解情况,我们发现了一个限制:如果 \(finc[j]=j-i\) ,那么我们放的羊肯定要小于等于 j 。不然放下一只羊时必定会导致无解情况( finc可能会增加,\(j-i\) 必定会减小)。而我们只需要满足 j 最小的限制就行了。原因是满足了以后之后的 finc 都会减一,避免了上面的情况。

满足上面的限制后,我们贪心地选取 r 最小的羊。因为我们要尽量避免相交,如果一开始就选取大的 r ,之后的相交数只会吧变多不会变少。

最后一个步骤,选择完点后,我们要根据这个点更新之后羊的 fin 。具体地,我们要保证与之相交的点最远放到的位置小于等于 \(i+mid\) 。

也许我讲的不够清楚,我再把 check 的总过程放上来:

inline bool check(int mid)
{
for(int i = 1;i <= n;i ++) fin[i] = n, ans[i] = 0, fl[i] = 0;
for(int i = 1;i <= n;i ++)
{
int b = 0, p = 0;
memset(finc, 0, sizeof(finc));
for(int j = 1;j <= n;j ++) if(!fl[j]) finc[fin[j]] ++;//统计 fin 为 j 的羊的只数
for(int j = 1;j <= n;j ++) finc[j] += finc[j - 1]; //实际上 finc 就是求一遍前缀和
for(int j = i;j <= n;j ++) if(finc[j] > j - i + 1) return 0;//判无解(被标记的点统计 finc 时就没有贡献,无需额外判断)
for(int j = n;j >= i;j --) if(finc[j] == j - i + 1) b = j;//寻找最小的限制
for(int j = 1;j <= n;j ++) if(!fl[j] && fin[j] <= b && r[j] < r[p]) p = j;//在限制内寻找最小的 r
fl[ans[i] = p] = 1;//标记,之后不能再选
for(int j = 1;j <= n;j ++) if(l[j] <= r[p] && l[p] <= r[j]) fin[j] = min(fin[j], i + mid);//更新fin
}
return 1;
}

为了方便判断,我在主函数中将 \(r[0] = INF\)。需要注意一下


后记

其实,我们判断无解时用了一个叫做霍尔定理的东西。但由于太过显然,我就直接证了一遍。有兴趣的同学可以自行了解。

CF309E 题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

  10. JSOI2016R3 瞎BB题解

    题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...

随机推荐

  1. Java-token生成

    1. 引入jar包 <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt< ...

  2. [2004年NOIP提高组] 合并果子

    在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可以看出,所 ...

  3. python机器学习——随机森林算法

    背景与原理: 首先我们需要知道集成学习的概念,所谓集成学习,就是使用一系列学习器进行学习,并且通过某种规则把这些学习器的学习结果整合起来从而获得比单个学习器学习效果更好的机器学习方法.这样的方法可以用 ...

  4. 项目实训DAY7

    今天与昨天一样,查论文,并美化了一下功能界面的样式.

  5. swift 应用内切换语言

    1:在project info中的locations添加需要的语言 2:创建Localizable.strings文件 点击右边的localization勾选需要的语言 3:创建InfoPlist.s ...

  6. QT动态库的创建和使用

    QT动态库的创建和使用 步骤一: 创建一个库文件 Library 步骤二:进行动态库封装方法的实现 注意事项:要注意共享类均需要包含导出的宏定义 这个宏定义和导出向导的宏定义一致 宏定义: 向导文件: ...

  7. 浅谈oracle连接远程数据库

    若是本地安装了oracle服务器 1 比较直接的方式是直接修改配置文件 去...\product\11.2.0\dbhome_1\NETWORK\ADMIN下面找三个.ora的配置文件:sqlnet. ...

  8. MySQL_20200417

    MySQL安装与卸载 SQL语句与Oracle大致相同 主要使用 Navicat for MySQL进行数据库操作 MySQL常用的命令: 登录:mysql -uroot -p  /mysql -ur ...

  9. 【PostgreSql】more than one owned sequence found

    do --check seq not in sync $$ declare _r record; _i bigint; _m bigint; begin for _r in ( Select DIST ...

  10. DNS服务学习笔记

    1.基本概念 ​ DNS(Domain Name System)域名系统,在TCP/IP网络中有非常重要的地位,能够提供域名与IP地址的解析服务. ​ DNS是一个分布式数据库,命名系统采用层次的逻辑 ...