【决策单调性】交与并
bzoj 2687。
举几个例子,会发现可能满足决策单调性,并且答案只能由两个区间组成。这里证明一下。
假设有
定义
两式相加,得:
显然是矛盾的。
但还要考虑一个区间被包含的情况,具体可以看 zsw 的博客(
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 1e6+10;
struct D{
ll l,r;
}a[N],b[N];
ll ans,dp[N],n;
ll w(int l,int r) {
if(l >= r) return -1e18;
return (a[r].r - a[l].l) * (a[l].r - a[r].l);
}
void fz(int L,int R,int l,int r) {
if(L > R) return ; int mid = L+R>>1; int opt = l;
for(int i=l;i<=min(mid,r);i++)
if(w(i,mid) > w(opt,mid)) opt = i;
ans = max(ans,w(opt,mid));
fz(L,mid-1,l,opt), fz(mid+1,R,opt,r);
}
int q[N];
int fd(int i,int L,int R) {
while(L + 1 < R) {
int mid = L + R >> 1;
if(b[q[mid]].r >= b[i].r) R = mid;
else L = mid;
}
return R;
}
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++){cin>>b[i].l>>b[i].r;}
sort(b+1,b+n+1,[](D x,D y) {
return x.l == y.l ? x.r > y.r : x.l < y.l;
});
int _n = 0;
for(int i=1, R = 0;i<=n;i++) {
if(b[i].r > a[_n].r) {
while(R && b[i].r - b[i].l >= b[q[R]].r - b[q[R]].l) R--;
q[++R] = i; a[++_n] = b[i];
}
else if(R){
int x = q[fd(i,0,R+1)];
ans = max(ans,(b[x].r-b[x].l) * (b[i].r - b[i].l));
}
}
n = _n;
fz(1,n,1,n);
cout<<ans;
return 0;
}
本文作者:cjrqwq
本文链接:https://www.cnblogs.com/yfzqwq/p/18492753
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」