CF309E 题解
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 题解的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
- JSOI2016R3 瞎BB题解
题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...
随机推荐
- 全文检索引擎:solr lucene
solr在lucene外边做了一层厚厚的封装,主要是为了简化二次开发,提供了一些成熟的解决方案. Lucene是全文检索是对索引中Document的各field进行匹配,可返回document,得到查 ...
- 冰冻三尺非一日之寒,记录Java
一.数据类型 Java是一种强类型语言,什么是强类型语言? 强类型语言:要求变量的使用要严格符合规定,所有变量都必须先定义后才能使用 Java的数据类型又分为两大类: 1.基本类型:基本类型有分为数值 ...
- HDFS 机架感知与副本放置策略
HDFS 机架感知与副本放置策略 机架感知(RackAwareness) 通常,大型 Hadoop 集群会分布在很多机架上,在这种情况下, 希望不同节点之间的通信能够尽量发生在同一个机架之内,而不是跨 ...
- 数据结构(C语言)_链表
//单链表按序号查找节点的值 LNode* GetElem(LinkList L, int i) { int j = 1; LNode* p = L->next; if (i == 0) ret ...
- java循环中的break和continue的小笔记
代码1: for(int i=0;i<10;i++){ System.out.println(i); continue; System.out.println("flag") ...
- fastdfs 上传成功后返回了错误URL,Request URL: http://localhost:8081/121.122.25.133/group1/M00/00/00/wKgZhV63.jpg
错误的URL. 原因: 图片服务器地址格式错误,fastdfs返回了错误的URL IMAGE_SERVER_URL = http:121.12.25.13/ 正确: IMAGE_SERVER_URL ...
- HTML完整语法学习
https://www.cnblogs.com/douluo/archive/2021/11/20/15582217.html
- 面向对象3(Java)
多态 基本介绍 即同一方法可以根据发送对象的不同而采用多种不同的行为方式 一个对象的实际类型是确定的,但是可以指向对象的引用类型可以很多 多态存在的条件:a.有继承关系:b.子类重写父类方法:c.父类 ...
- Android studio 使用dialog提示信息
package com.example.androidtest2; import androidx.appcompat.app.AlertDialog;import androidx.appcompa ...
- JNI接口的实现
JNI接口的实现 什么是JNI 说明:JNI 是 Java Native Interface 的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++,但是它并不妨碍你使用 ...