【BZOJ2687】交与并
【题目链接】
- 点击打开链接
【双倍经验连接】
- 【BZOJ2369】区间
【思路要点】
我们发现选取三个及以上个数的区间是没有意义的,因为首先我们选取的所有区间需要是有交的,这便意味着所有区间的并由左端点最靠左的区间和右端点最靠右的区间直接确定,删去其余的区间不会使区间的并或区间的交减少,因此我们可以认为我们只会选取两个区间。
我们选取的两个区间的关系有可能是包含或相交。
考虑有包含关系的区间A,B,CA,B,CA,B,C,其中A⊂B,A⊂CA⊂B,A⊂CA\subset B,A\subset C,那么可以发现选取(B,C)(B,C)(B,C)的收益会不小于选取(A,C)(A,C)(A,C)或(A,B)(A,B)(A,B)的收益,因此我们可以认为在考虑包含关系的时候,一个区间可以任意与一个包含它的区间配对,而所漏掉的情况会在相交关系的部分有更好的解。
接下来,我们只需要考虑有相交关系两个区间,不妨认为此时区间的左端点以及右端点均单调递增。
考虑选择([l1,r1],[l2,r2])([l1,r1],[l2,r2])([l_1,r_1],[l_2,r_2])的收益和选择([l1,r1],[l3,r3])([l1,r1],[l3,r3])([l_1,r_1],[l_3,r_3])的收益,将它们作差,有
δ=(r3−l1)∗(r1−l3)−(r2−l1)∗(r1−l2)=(r3−r2)∗r1+(l3−l2)∗l1+l2r2−l3r3δ=(r3−l1)∗(r1−l3)−(r2−l1)∗(r1−l2)=(r3−r2)∗r1+(l3−l2)∗l1+l2r2−l3r3\delta=(r_3-l_1)*(r_1-l_3)-(r_2-l_1)*(r_1-l_2)=(r_3-r_2)*r_1+(l_3-l_2)*l_1+l_2r_2-l_3r_3
我们发现对于固定区间[l1,r1][l1,r1][l_1,r_1]右侧的两个区间[l2,r2],[l3,r3](l3>l2,r3>r2)[l2,r2],[l3,r3](l3>l2,r3>r2)[l_2,r_2],[l_3,r_3](l_3>l_2,r_3>r_2),一旦选取([l1,r1],[l3,r3])([l1,r1],[l3,r3])([l_1,r_1],[l_3,r_3])优于([l1,r1],[l2,r2])([l1,r1],[l2,r2])([l_1,r_1],[l_2,r_2]),那么对于[l1,r1][l1,r1][l_1,r_1]右侧的每个区间[lx,rx][lx,rx][l_x,r_x],均有选取([lx,rx],[l3,r3])([lx,rx],[l3,r3])([l_x,r_x],[l_3,r_3])优于([lx,rx],[l2,r2])([lx,rx],[l2,r2])([l_x,r_x],[l_2,r_2])因此,每个区间右侧的最优决策区间具有决策单调性。
分治解决即可,时间复杂度O(NLogN)O(NLogN)O(NLogN)。
【代码】
#include<bits/stdc++.h>using namespace std; const int MAXN = 1000005; template <typename T> void chkmax(T &x, T y) {x = max(x, y); } template <typename T> void chkmin(T &x, T y) {x = min(x, y); } template <typename T> void read(T &x) {x = 0; int f = 1;char c = getchar();for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;for (; isdigit(c); c = getchar()) x = x * 10 + c - '0';x *= f; } template <typename T> void write(T x) {if (x < 0) x = -x, putchar('-');if (x > 9) write(x / 10);putchar(x % 10 + '0'); } template <typename T> void writeln(T x) {write(x);puts(""); } struct info {int l, r; }; int n; info a[MAXN]; long long ans; bool cmp(info x, info y) {if (x.l == y.l) return x.r > y.r;else return x.l < y.l; } void solve(int l, int r, int sl, int sr) {int mid = (l + r) / 2;long long tans = 0; int home = max(mid + 1, sl);for (int i = max(mid + 1, sl); i <= sr; i++) {long long tmp = 1ll * (a[i].r - a[mid].l) * (a[mid].r - a[i].l);if (tmp >= tans) {tans = tmp;home = i;}}chkmax(ans, tans);if (mid > l) solve(l, mid - 1, sl, home);if (mid < r) solve(mid + 1, r, home, sr); } int main() {read(n);for (int i = 1; i <= n; i++)read(a[i].l), read(a[i].r);sort(a + 1, a + n + 1, cmp);int Max = 0, tn = 0;for (int i = 1; i <= n; i++) {if (a[i].r > a[Max].r) {Max = ++tn;a[tn] = a[i];} else chkmax(ans, 1ll * (a[i].r - a[i].l) * (a[Max].r - a[Max].l));}solve(1, tn, 1, tn);writeln(ans);return 0; }
【BZOJ2687】交与并相关推荐
- [BZOJ2687]交与并
在 UNR 上看到这样一道题,当时想起来就是大视野原题,发现自己竟然没过,就刷了一波. [BZOJ2687]交与并 试题描述 对于一个区间集合 \(\{A_1,A_2,\cdots,A_K\}(K&g ...
- BZOJ2687 交与并/BZOJ2369 区间【决策单调性优化DP】【分治】
Description 对于一个区间集合 {A1,A2--Ak}(K>1,Ai不等于Aj(i不等于J),定义其权值 S=|A1∪A2∪--AK|*|A1∩A2--∩Ak| 即它们的交区间的长度乘 ...
- BZOJ2687 交与并
标签:单调队列 题目 题目传送门 Description 对于一个区间集合{A1,A2--AK}(K>1,Ai<>Aj{i<>j}),我们定义其权值 W=|A1∪A2∪- ...
- [BZOJ2687]交与并[决策单调性]
题意 给定 \(n\) 个区间,我们定义区间集合 \(S(|S|>1)\) 的权值为 区间交 \(\times\) 区间并,找出权值最大的区间集合. \(n\le 10^6\) 分析 首先排除区 ...
- 「6月雅礼集训 2017 Day4」qyh(bzoj2687 交与并)
原题传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2687 [题目大意] 给出若干区间,求一个区间的大于等于2的子集,使得 |区间并| 和 | ...
- BZOJ2687: 交与并
$n \leq 1e6$个区间,定义一个区间集合的权值为:并集大小-交集大小.求一个权值最大的大小至少为2的集合. 好题. 在一个区间集合中,可以发现除了左右端点涉及的区间外,里面剩余的区间越少,并集 ...
- bzoj2687 交与并(贪心+dp+决策单调性+分治)
双倍经验:portal #include <cstdio> #include <cstring> #include <algorithm> #include < ...
- bzoj 2687 交与并
http://www.elijahqi.win/archives/3208 Description 对于一个区间集合{A1,A2--AK}(K>1,Ai<>Aj{i<>j ...
- YOLOv4没交棒,但YOLOv5来了!
YOLOv4没交棒,但YOLOv5来了! 前言 4月24日,YOLOv4来了! 5月30日,"YOLOv5"来了! 这里的 "YOLOv5" 是带有引号的,因为 ...
最新文章
- SolrJ搜索功能切换到集群
- mysql mgr故障恢复实现_MGR实现分析 - 成员管理与故障恢复实现
- drtek收音机使用说明_【火腿实验室】使用双FSL中波环形天线消除同频干扰电台信号...
- react redux学习之路
- mysql学习笔记-事务
- SAP UI5 应用开发教程之六十八 - 如何实现 SAP UI5 路由失败时显示自定义的 NOT Found 页面
- Linux程序选择boy糊者girl,linux脚本程序练习-Go语言中文社区
- 前端学习(2958):组件之间的参数传递子传父
- Android 秒级编译FreeLine
- ORA-01089 数据库无法正常关闭
- linux 实验 广技师 进程管理与系统监视,实验9 linux进程管理与系统监视.doc
- 汉字 计算机 坟墓,「墓」字意思,墓怎么读,部首笔画及组词-汉语字典-小娃子
- 原生ajax调用,JavaScript进阶之原生AJAX接口请求的方式
- Mysql获取流水号
- 发邮件向论文作者卑微求代码模板
- CBDB中国历代人物历史可视化系统
- 陈彤离职,新浪在门户竞争中将继续被边缘化
- 通过PC发送手机短信
- 如何快速搭建”疫情问答“小助手服务
- 程序员如何预防大龄危机
热门文章
- ART世界探险(18) InlineMethod
- python函数速查手册_Python进阶-内置函数大全
- 论文解读:ViT | AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE
- 计算机制作培训通知知识点,现代教育的技术计算机基本知识点培训.ppt
- 【干货走一波】xxx平台JavaEE云计算大数据全套视频免费下载
- Redis的线程模型
- 动态壁纸安卓_安卓主题壁纸软件下载-安卓主题壁纸安卓版下载v9.0.7
- 本人的QQ群:有来的可以加。
- 啸叫抑制算法 ------陷波器
- js通过URL下载文件