【决策单调性】交与并

bzoj 2687。

举几个例子,会发现可能满足决策单调性,并且答案只能由两个区间组成。这里证明一下。

假设有 opt(y)=p<opt(x)=q<x<yopt(y)=p<opt(x)=q<x<y,且 4 个区间都有相交的地方。

定义 lx,rxl_x,r_x,分别为 x 的左右端点。那么会有:(下面式子只代表大小关系)

lp=1,lq=2,lx=3,ly=4,rp=5,rq=6,rx=7,ry=8l_p=1,l_q=2,l_x=3,l_y=4,r_p=5,r_q=6,r_x=7,r_y=8 (rylp)(rply)>(rylq)(rqly)(r_y-lp)(r_p-l_y) > (r_y-lq)(r_q-l_y) 858451+41>868462+4285-84-51+41 > 86-84-62+42 (rxlq)(rqlx)>(rxlp)(rplx)(r_x-l_q)(r_q-l_x) > (r_x-l_p)(r_p-l_x) 767362+32>757351+3176-73-62+32 > 75-73-51+31

两式相加,得:

858451+41+767362+32>868462+42+757351+3185-84-51+41+76-73-62+32 > 86-84-62+42+75-73-51+31 (78)(65)+(43)(12)>0(7-8)(6-5)+(4-3)(1-2) > 0

显然是矛盾的。

但还要考虑一个区间被包含的情况,具体可以看 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;
}
posted @ 2024-06-04 14:10  cjrqwq  阅读(17)  评论(0)    收藏  举报  来源