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. Coursera Programming Languages, Part C 华盛顿大学 Week 2

    week 2 我们采用一种新的视角来对比 FP 与 OOP,即将问题分解 (decompose) 与实现 (implement) 的方式 OOP Versus Functional Decomposi ...

  2. 在安装SDK8.1和Visual Studio 2017时,提示“已停止工作”

    解决办法:在微软官网下载 .net framework 的最新的开发包(Build apps - Dev Pack),重新安装后问题得到解决. https://dotnet.microsoft.com ...

  3. nginx 添加ssl认证,访问静态资源 笔记

    1.查看是否开启SSL模块, /usr/local/nginx/sbin    ./nginx  -V 2.没有开启,进入到nginx源码包目录下: 3编译 ./configure --prefix= ...

  4. Postgresql统计所有表的基本信息(如行数、大小等)

    目录 pg_class 记录表和几乎所有具有列或者像表的东西.这包括索引(但还要参见 pg_index ).序列.视图.物化视图.组合类型和TOAST表,参见 relkind .下面,当我们提及所有这 ...

  5. Element-ui树形控件el-tree鼠标移入显示隐藏效果超简单

    显示效果: 废话不多说,直接上代码 <template> <el-tree default-expand-all :data="data"> <spa ...

  6. mysql锁表原因及解决方法

    mysql锁表原因及解决方法   一.导致锁表的原因 1.锁表发生在insert update .delete 中: 2.锁表的原理是 数据库使用独占式封锁机制,当执行上面的语句时,对表进行锁住,直到 ...

  7. CSS 常用样式-盒子实体化三属性

    如果想在浏览器中具体看到一个盒子占有的实际位置,需要设置盒子可以实体化的三属性. 实体化属性:

  8. java注解-最通俗易懂的讲解

    来源:秒懂,Java 注解 (Annotation)你可以这样学 Annotation 中文译过来就是注解.标释的意思,在 Java 中注解是一个很重要的知识点,但经常还是有点让新手不容易理解. 我个 ...

  9. 递推(dp)纪中真题

    前言: 日月如梭,光阴似箭.大家好,我盛艺承又回来了.今天给大家讲一下纪中的DP(递推)真题. 题目描述 在网格中取一个N x 1的矩形,并把它当作一个无向图.这个图有2(N+1)个顶点,有3(N-1 ...

  10. kvm虚拟机添加在线快照

    1-1.创建默认快照--一般为一串数字 virsh snapshot-create 虚拟机名称 1-2.创建自定义名称快照 virsh snapshot-create-as 虚拟机名称 快照名称 2. ...