Description

对于一个区间集合

{A1,A2……Ak}(K>1,Ai不等于Aj(i不等于J),定义其权值

S=|A1∪A2∪……AK|*|A1∩A2……∩Ak|

即它们的交区间的长度乘上它们并区间的长度。

显然,如果这些区间没有交集则权值为0。

Your Task

给定你若干互不相等的区间,选出若干区间使其权值最大。

Input

第一行n表示区间的个数

接下来n行每行两个整数l r描述一个区间[l,r]

Output

在一行中输出最大权值

Sample Input

4

1 6

4 8

2 7

3 5

Sample Output

24

HINT

样例解释

选择[1,6]和[2,7]是最优的。

数据约定

100%:1<N<=106,1<=L<R<=106


思路

首先发现一个性质:更新答案的时候只会选择两个区间

因为如果有三个区间,要么交集是空,要么有一个被包含,就很不优秀,所以最多选两个

然后再按照左端点为第一关键字,右端点是第二关键字来排序

扫一遍判断包含的情况

并把不互相包含的最大区间选出来

这个时候推一下打个表发现对于任意的\(i<j<k<l\),如果在k的时候j比i优,那么在l的时候j一定比i优

也就是具有了决策单调性

所以就可以进行分治了

然后只需要枚举mid的决策点是哪一个递归进行就行了

注意要特判mid没有决策点的情况,左右区间继承父亲区间的全部决策区间


//Author: dream_maker
#include<bits/stdc++.h>
using namespace std;
//----------------------------------------------
//typename
typedef long long ll;
//convenient for
#define for_up(a, b, c) for (int a = b; a <= c; ++a)
#define for_down(a, b, c) for (int a = b; a >= c; --a)
#define for_vector(a, b) for (int a = 0; a < (signed)b.size(); ++a)
//inf of different typename
const int INF_of_int = 1e9;
const ll INF_of_ll = 1e18;
//fast read and write
template <typename T>
void Read(T &x) {
bool w = 1;x = 0;
char c = getchar();
while (!isdigit(c) && c != '-') c = getchar();
if (c == '-') w = 0, c = getchar();
while (isdigit(c)) {
x = (x<<1) + (x<<3) + c -'0';
c = getchar();
}
if (!w) x = -x;
}
template <typename T>
void Write(T x) {
if (x < 0) {
putchar('-');
x = -x;
}
if (x > 9) Write(x / 10);
putchar(x % 10 + '0');
}
//----------------------------------------------
const int N = 1e6 + 10;
struct Segment{
int l, r;
}a[N], s[N];
int n;
bool cmp(Segment a, Segment b) {
if (a.l == b.l) return a.r > b.r;
return a.l < b.l;
}
ll ans = 0;
void solve(int l, int r, int pl, int pr) {
if (l >= r) return;
int mid = (l + r) >> 1;
int pos = 0;ll maxv = -1;
for_up(i, pl, min(mid - 1, pr)) {
if (s[i].r < s[mid].l) continue;
ll val = 1ll * (s[mid].r - s[i].l) * (s[i].r - s[mid].l);
if (val > maxv) maxv = val, pos = i;
}
ans = max(ans, maxv);
if (pos) {
solve(l, mid, pl, pos);
solve(mid + 1, r, pos, pr);
} else {
solve(l, mid, pl, pr);
solve(mid + 1, r, pl, pr);
}
}
int main() {
Read(n);
for_up(i, 1, n) Read(a[i].l), Read(a[i].r);
sort(a + 1, a + n + 1, cmp);
int tot = 0, maxr = -1, pos = 0;
for_up(i, 1, n) {
if (a[i].r > maxr) {
s[++tot] = a[i];
maxr = a[i].r;
pos = i;
} else {
ans = max(ans, 1ll * (a[i].r - a[i].l) * (a[pos].r - a[pos].l));
}
}
n = tot;
solve(1, n, 1, n);
Write(ans);
return 0;
}

BZOJ2687 交与并/BZOJ2369 区间【决策单调性优化DP】【分治】的更多相关文章

  1. Lightning Conductor 洛谷P3515 决策单调性优化DP

    遇见的第一道决策单调性优化DP,虽然看了题解,但是新技能√,很开森. 先%FlashHu大佬,反正我是看了他的题解和精美的配图才明白的,%%%巨佬. 废话不多说,看题: 题目大意 已知一个长度为n的序 ...

  2. CF868F Yet Another Minimization Problem 分治决策单调性优化DP

    题意: 给定一个序列,你要将其分为k段,总的代价为每段的权值之和,求最小代价. 定义一段序列的权值为$\sum_{i = 1}^{n}{\binom{cnt_{i}}{2}}$,其中$cnt_{i}$ ...

  3. 2018.09.28 bzoj1563: [NOI2009]诗人小G(决策单调性优化dp)

    传送门 决策单调性优化dp板子题. 感觉队列的写法比栈好写. 所谓决策单调性优化就是每次状态转移的决策都是在向前单调递增的. 所以我们用一个记录三元组(l,r,id)(l,r,id)(l,r,id)的 ...

  4. [BZOJ4850][JSOI2016]灯塔(分块/决策单调性优化DP)

    第一种方法是决策单调性优化DP. 决策单调性是指,设i>j,若在某个位置x(x>i)上,决策i比决策j优,那么在x以后的位置上i都一定比j优. 根号函数是一个典型的具有决策单调性的函数,由 ...

  5. BZOJ2216 Poi2011 Lightning Conductor 【决策单调性优化DP】

    Description 已知一个长度为n的序列a1,a2,...,an. 对于每个1<=i<=n,找到最小的非负整数p满足 对于任意的j, aj < = ai + p - sqrt( ...

  6. 决策单调性优化dp 专题练习

    决策单调性优化dp 专题练习 优化方法总结 一.斜率优化 对于形如 \(dp[i]=dp[j]+(i-j)*(i-j)\)类型的转移方程,维护一个上凸包或者下凸包,找到切点快速求解 技法: 1.单调队 ...

  7. 算法学习——决策单调性优化DP

    update in 2019.1.21 优化了一下文中年代久远的代码 的格式…… 什么是决策单调性? 在满足决策单调性的情况下,通常决策点会形如1111112222224444445555588888 ...

  8. 洛谷 P5897 - [IOI2013]wombats(决策单调性优化 dp+线段树分块)

    题面传送门 首先注意到这次行数与列数不同阶,列数只有 \(200\),而行数高达 \(5000\),因此可以考虑以行为下标建线段树,线段树上每个区间 \([l,r]\) 开一个 \(200\times ...

  9. BZOJ4899: 记忆的轮廓【概率期望DP】【决策单调性优化DP】

    Description 通往贤者之塔的路上,有许多的危机. 我们可以把这个地形看做是一颗树,根节点编号为1,目标节点编号为n,其中1-n的简单路径上,编号依次递增, 在[1,n]中,一共有n个节点.我 ...

  10. 2018.10.14 NOIP训练 猜数游戏(决策单调性优化dp)

    传送门 一道神奇的dp题. 这题的决策单调性优化跟普通的不同. 首先发现这道题只跟r−lr-lr−l有关. 然后定义状态f[i][j]f[i][j]f[i][j]表示猜范围为[L,L+i−1][L,L ...

随机推荐

  1. Select级联菜单,用Ajax获取Json绑定下拉框(jQuery)

    需求类似这样  ↓ ↓ ↓   -->    菜单A发生变化,动态取数据填充下拉菜单B. JS代码如下: <script type="text/javascript"& ...

  2. python学习笔记glob模块

    python有许多的类库,现将学习记录下来,以供以后回顾复习: 1.glob模块 用于文件名操作,匹配指定目录下的文件,返回的是目录加文件名,常用的有两个函数: glob(pattern),返回匹配的 ...

  3. ThinkPHP开发笔记-控制器

    1.下面就是一个典型的控制器类的定义: <?php namespace Home\Controller; use Think\Controller; class IndexController ...

  4. winform无边框窗体点击任务栏最小化

    protected override CreateParams CreateParams { get { const int WS_MINIMIZEBOX = 0x00020000; // Winus ...

  5. Linux命令详解-cal

    cal命令可以用来显示公历(阳历)日历.公历是现在国际通用的历法,又称格列历,通称阳历."阳历"又名"太阳历",系以地球绕行太阳一周为一年,为西方各国所通用,故 ...

  6. php5权限控制修饰符,interface和abstract

    1.public:public表明该数据成员.成员函数是对所有用户开放的,所有用户都可以直接进行调用 2.private:private表示私有,私有的意思就是除了class自己之外,任何人都不可以直 ...

  7. 这可能是最详细的 iOS 学习入门指南(含书目/文档/学习资料)

    1 零基础小白如何进行 iOS 系统学习 首先,学习目标要明确: 其次,有了目标,要培养兴趣,经常给自己一些正面的反馈,比如对自己的进步进行鼓励,在前期小步快走: 再次,学技术最重要的一点就是多动手. ...

  8. 网络编程之socketserver初识

    网络编程之socketserver初识 Server #!/usr/bin/env python # @Author : "Wjl" # @Date : 2017/12/22 # ...

  9. Prism 4 文档 ---第5章 实现MVVM模式

        MVVM模式有助于清楚的区分应用程序界面的业务层和展现层.保持一个清晰的应用程序逻辑和UI分离有助于处理开发和设计过程中大量的问题,同时,使得应用程序的测试,维护,和扩展更加容易.MVVM也可 ...

  10. wxpython的简单的应用

    import wximport wx.xrc import pandas as pd from conf.env import * # 允许选择的文件wildcard = "Python s ...