bzoj2687: 交与并
Description
对于一个区间集合{A1,A2……AK}(K>1,Ai<>Aj{i<>j}),我们定义其权值
W=|A1∪A2∪……∪AK|*|A1∩A2∩……AK|
当然,如果这些区间没有交集则权值为0。
Input
给你N个各不相同的区间,请你从中找出若干个区间使其权值最大。
第一行N
接下来N行 l r(1<=l<r<=10^6)
Output
最大权值
Sample Input
1 6
4 8
2 7
3 5
Sample Output
样例注释:选择第1个和第3个区间,交为(2,6),并为(1,7),
权值为4*6=24.
HINT
100% 1<N<=10^6
题解:
选出的最优区间集合满足下列性质:
1.交集肯定不能为空。
2.设这个区间集合的并集为U,对于任意一个区间,设这个区间集合去掉这个区间的并集为U',满足U'⫋U。
第一条显然。。。
第二条:假如去掉这个集合后并集没有减小,去掉后显然交集不会减小,所以答案也不会变小。
所以选出来的集合只有一个区间或两个互不包含的区间。
由于集合大小不能为1,所以只能选两个区间。
首先我们将区间按左端点从小到大,如果左端点相同,则按右端点从大到小的顺序排好序。
对于其中一个区间含于另一个区间的情况:显然包含它的区间只能在他前面,而且具有单调性,所以用个单调队列维护一下即可。
对于两个互不包含的区间的情况:先将含于其他区间的区间去掉,这时区间的左右端点都单调上升,然后有一个性质:
假如第i-1个区间选择的最优区间为第k个(k<i-1),第i个区间选择的最优区间为第j个(j<i),则有k<=j
证明:
假设j<k,对于i,有:
同理,对于i-1(记作i'),有:
所以假设不成立,所以有k<=j,这样就有决策单调性了,用栈来维护一下即可。
code:
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
char ch;
bool ok;
void read(int &x){
for (ok=,ch=getchar();!isdigit(ch);ch=getchar()) if (ch=='-') ok=;
for (x=;isdigit(ch);x=x*+ch-'',ch=getchar());
if (ok) x=-x;
}
const int maxn=;
typedef long long int64;
int n,cnt,last;
int64 ans;
struct Seg{
int l,r;
}seg[maxn];
inline bool cmp(const Seg &a,const Seg &b){return (a.l<b.l)||(a.l==b.l&&a.r>b.r);}
inline int64 calc(const Seg &j,const Seg &i){return 1LL*(i.r-j.l)*(j.r-i.l);}
struct Stack{
int top,pos;
struct Data{
int l,r,id;
}s[maxn],tmp;
void init(){s[top=]=(Data){,n,},pos=;}
bool cmp(int a,int x,int y){return calc(seg[x],seg[a])<calc(seg[y],seg[a]);}
int get(int id){
int l=tmp.l,r=tmp.r,m,a=tmp.id;
while (l<r){
m=((l+r)>>)+;
if (cmp(m,a,id)) l=m; else r=m-;
}
return l;
}
void push(int id){
while (top&&!cmp(s[top].l,s[top].id,id)) top--;
tmp=s[top--];
int m=get(id);
if (tmp.l<=m) s[++top]=(Data){tmp.l,m,tmp.id};
if (m<n) s[++top]=(Data){m+,n,id};
}
int64 query(int x){
while (x>s[pos].r) pos++;
return calc(seg[s[pos].id],seg[x]);
}
}stack;
struct Que{
int head,tail;
struct Data{
int r,len;
}q[maxn],tmp;
void init(){head=,tail=;}
void push(int id){
tmp=(Data){seg[id].r,seg[id].r-seg[id].l};
while (head<=tail&&q[tail].len<=tmp.len) tail--;
q[++tail]=tmp;
}
int64 query(int id){
int r=seg[id].r;
while (head<=tail&&q[head].r<r) head++;
if (head<=tail) return q[head].len;
else return -;
}
}que;
int main(){
read(n);
for (int i=;i<=n;i++) read(seg[i].l),read(seg[i].r);
sort(seg+,seg+n+,cmp),que.init();
for (int i=;i<=n;i++)
if (seg[i].r>last) last=seg[i].r,seg[++cnt]=seg[i],que.push(i);
else ans=max(ans,que.query(i)*(seg[i].r-seg[i].l));
n=cnt,stack.init();
for (int i=;i<=n;i++) ans=max(ans,stack.query(i)),stack.push(i);
printf("%lld\n",ans);
return ;
}
bzoj2687: 交与并的更多相关文章
- [BZOJ2687]交与并[决策单调性]
题意 给定 \(n\) 个区间,我们定义区间集合 \(S(|S|>1)\) 的权值为 区间交 \(\times\) 区间并,找出权值最大的区间集合. \(n\le 10^6\) 分析 首先排除区 ...
- BZOJ2687 交与并/BZOJ2369 区间【决策单调性优化DP】【分治】
Description 对于一个区间集合 {A1,A2--Ak}(K>1,Ai不等于Aj(i不等于J),定义其权值 S=|A1∪A2∪--AK|*|A1∩A2--∩Ak| 即它们的交区间的长度乘 ...
- 「6月雅礼集训 2017 Day4」qyh(bzoj2687 交与并)
原题传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2687 [题目大意] 给出若干区间,求一个区间的大于等于2的子集,使得 |区间并| 和 | ...
- 使用单调队列维护决策三元组实现决策单调性优化DP的一些细节
以[BZOJ2687]交与并为例给出代码. #include <bits/stdc++.h> #define rin(i,a,b) for(register int i=(a);i< ...
- C语言 · 矩形面积交
问题描述 平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴.对于每个矩形,我们给出它的一对相对顶点的坐标,请你编程算出两个矩形的交的面积. 输入格式 输入仅包含两行,每行描述一个矩形. 在每行中 ...
- CF 337D 求圆交
题目链接:http://codeforces.com/problemset/problem/337/D 题意:就是一棵树上,有一些点被来自东方的神秘力量影响的,力量影响范围是d,为可能的力量源有几个. ...
- ray与triangle/quad求交二三事
引擎中,ray与quad求交,算法未细看,但有求解二次方程,不解.ray与triangle求交,使用的是97年经典算法,仔细看过论文,多谢小武同学指点,用到了克拉默法则求解线性方程组.想模仿该方法,做 ...
- 说说无耻的商河水木清华开发商2013"交房
说说无耻的水木清华开发商2013"交房" 我买的是22号楼,合同里写的是2011年6月30号前交房.4月28我手机响了,电话那边说是水木清华的,29号交房.说交房通知书已经EMS发 ...
- HDU 5130 Signal Interference --计算几何,多边形与圆的交面积
题意: 求所有满足PB <= k*PA 的P所在区域与多边形的交面积. 解法: 2014广州赛区的银牌题,当时竟然没发现是圆,然后就没做出来,然后就gg了. 圆的一般式方程: 设A(x1,y1) ...
随机推荐
- 385. Mini Parser
括号题一般都是stack.. 一开始想的是存入STACK的是SRING,然后POP出括号在构建新的NestedInteger放到另一个里面,但是操作起来费时费力. 后来猛然发现其实可以直接吧Neste ...
- jersey构建rest服务返回json数据
1. eclipse 创建 dynamic web project 2. 将jersey相关jar包放到libs目录下 3. web.xml 增加 jersey 相关内容 <?xml ver ...
- hdu 2824 The Euler function(欧拉函数)
如果打表的话会超内存,我想到了一种方法解决这个问题.题目给出的数据时3000000,我将三百万分成300个数据,将整万的数据存储下来,计算的时候,先计算x和y之间整万的数据,然后再计算零散数据. 想法 ...
- 你的Jsp页面有黄×么,有黄色问号么?Multiple annotations found at this line: - Invalid location of tag (form). - No
jsp页面有黄色问号代表我们的html标签不符合规范 对于很多人拿到页面美工给的页面,有时候很多都有黄色的问号. 为什么会这样呢? Multiple annotations found at this ...
- VS2010+Opencv-2.4.9的配置攻略
1.下载软件 vs2010入门书籍,免积分下载 http://download.csdn.net/detail/u014112584/7325617 opencv2.4.0版本号和一些样例,免积分 ...
- java websockect
https://github.com/TooTallNate/Java-WebSocket (websockect类库包) http://blog.openlg.net/index.php/archi ...
- iOS-系统定位功能
ios系统定位 前期准备 系统定位功能,需要用到框架:CoreLocation/CoreLocation.h, 然后导入文件#import <CoreLocation/CoreLocation. ...
- SQL PL基本概念
--声明变量 --1.语法: --declare <varible-name> <data-type> <default-constant>默认不变 --decla ...
- .NET中TextBox控件设置ReadOnly=true后台取不到值三种解决方法
当TextBox设置了ReadOnly=true后要是在前台为控件添加了值,后台是取不到的,值为空,多么郁闷的一个问题经过尝试,发现可以通过如下的方式解决这个问题.感兴趣的朋友可以了解下 当TextB ...
- java的List接口的实现类 ArrayList,LinkedList,Vector 的区别
Java的List接口有3个实现类,分别是ArrayList.LinkedList.Vector,他们用于存放多个元素,维护元素的次序,而且允许元素重复. 3个具体实现类的区别如下: 1. Array ...