[BZOJ2687]交与并为例给出代码。

#include <bits/stdc++.h>

#define rin(i,a,b) for(register int i=(a);i<=(b);++i)
#define irin(i,a,b) for(register int i=(a);i>=(b);--i)
#define trav(i,a) for(register int i=head[a];i;i=e[i].nxt)
#define Size(a) (int)a.size()
#define pb push_back
#define lowbit(x) ((x)&(-(x)))
typedef long long LL; using std::cerr;
using std::endl; inline int read(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
return x*f;
} const int MAXN=1000005; int n,tot;
LL ans; struct seg{
int l,r;
inline friend bool operator < (seg x,seg y){
return x.l==y.l?x.r>y.r:x.l<y.l;
}
}a[MAXN],b[MAXN]; inline LL calc(seg x,seg y){
if(x.r<=y.l)return 0;
return 1ll*(y.r-x.l)*(x.r-y.l);
} int bit[MAXN];
inline void ins(int x,int y){for(register int i=x;i<=1e6;i+=lowbit(i))bit[i]=std::max(bit[i],y);}
inline int ask(int x){int ret=0;for(register int i=x;i;i-=lowbit(i))ret=std::max(ret,bit[i]);return ret;} int hd,tl; struct Opt{
int j,l,r;
}q[MAXN]; int main(){
n=read();
rin(i,1,n)a[i].l=read(),a[i].r=read();
std::sort(a+1,a+n+1);
int maxr=0;
rin(i,1,n){
if(a[i].r<=maxr){
ans=std::max(ans,1ll*(a[i].r-a[i].l)*ask(1e6-a[i].r+1));
continue;
}
maxr=a[i].r;
b[++tot]=a[i];
ins(1e6-a[i].r+1,a[i].r-a[i].l);
}
n=tot;hd=tl=1;q[1]=(Opt){1,2,n};
rin(i,2,n){
int j=q[hd].j;
ans=std::max(ans,calc(b[j],b[i]));
++q[hd].l;if(q[hd].l>q[hd].r)++hd;
int pos=0;
while(1){
if(hd>tl){pos=i+1;break;}// 当队列为空时直接插入
int jt=q[tl].j,lt=q[tl].l,rt=q[tl].r;
if(calc(b[i],b[rt])<calc(b[jt],b[rt])){pos=rt+1;break;}// 在q[tl].r处严格劣于队尾决策时插入队尾
else if(calc(b[i],b[lt])>=calc(b[jt],b[lt])){--tl;continue;}// 在q[tl].l处不劣于队尾决策时删除队尾
else{
int l=lt,r=rt;
while(l<=r){
int mid=((l+r)>>1);
if(calc(b[i],b[mid])>=calc(b[jt],b[mid]))pos=mid,r=mid-1;// 找到队尾决策所对应区间内第一个不劣于队尾决策的位置
else l=mid+1;
}
q[tl].r=pos-1;// 更新队尾决策所对应区间的右端点
break;
}
}
if(pos<=n)q[++tl]=(Opt){i,pos,n};
}
printf("%lld\n",ans);
return 0;
}

使用单调队列维护决策三元组实现决策单调性优化DP的一些细节的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. BZOJ 1342: [Baltic2007]Sound静音问题 | 单调队列维护的好题

    题目: 给n个数字,一段合法区间[l,l+m-1]要求max-min<=c 输出所有合法区间的左端点,如果没有输出NONE 题解: 单调队列同时维护最大值和最小值 #include<cst ...

  9. [USACO2003][poj2018]Best Cow Fences(数形结合+单调队列维护)

    http://poj.org/problem?id=2018 此乃神题……详见04年集训队论文周源的,看了这个对斜率优化dp的理解也会好些. 分析: 我们要求的是{S[j]-s[i-1]}/{j-(i ...

随机推荐

  1. SpringBoot项目打成Jar包时运行

    使用java -jar ***.jar执行jar包的时候,会找jar包中的main()方法. 对于SpringBoot项目的Jar包,在META-INF目录下的MANIFEST.MF文件中,Main- ...

  2. 03:linux文件操作四剑客

    1.1 find查找命令 1.find命令说明 1. Linux find命令用来在指定目录下查找文件. 2. 任何位于参数之前的字符串都将被视为欲查找的目录名. 3. 如果使用该命令时,不设置任何参 ...

  3. 阻塞I/O、非阻塞I/O和I/O多路复用、怎样理解阻塞非阻塞与同步异步的区别?

    “阻塞”与"非阻塞"与"同步"与“异步"不能简单的从字面理解,提供一个从分布式系统角度的回答.1.同步与异步 同步和异步关注的是消息通信机制 (syn ...

  4. Asp.net4.5未在web服务器上注册

    在使用vs2012打开项目时,显示Asp.net4.5未在web服务器上注册?是由于没有下载一个补丁的原因,只需下载安装补丁 VS11-KB3002339.exe 下载地址:https://downl ...

  5. O022、如何使用 OpenStack CLI

    参考https://www.cnblogs.com/CloudMan6/p/5402490.html   本节首先讨论如何删除image,然后介绍OpenStack CLI 的使用方法,最后讨论如何  ...

  6. leetcode 对角线遍历 JavaScript

    JavaScript /** * @param {number[][]} matrix * @return {number[]} */ var findDiagonalOrder = function ...

  7. busybox介绍

    BusyBox 是一个集成了一百多个最常用linux命令和工具的软件.BusyBox 将许多具有共性的小版本的UNIX工具结合到一个单一的可执行文件.这样的集合可以替代大部分常用工具比如的GNU fi ...

  8. 运维学习篇之jenkins的安装(CentOS7)

    一. 介绍   Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能二. 作用  1.持续的软件版本 ...

  9. java8 lambda表达式应用

    1.用lambda表达式实现Runnable非常简单// Java 8之前: new Thread(new Runnable() { @Override public void run() { Sys ...

  10. libcyusb

    https://github.com/hmaarrfk/libcyusb/blob/master/include/cyusb.h