2019牛客1 i

大致題意:給你n個點,第i個點在的位置爲(xi,yi),有兩個屬性值(ai,bi)。現在讓你把這n個點劃分爲A和B兩個部分,使得最後不存在i∈A和j∈B,使得xi>=xj且yi<=yj。然後對於所有的劃分方法,找到並輸出

                                                                 

比較巧妙的dp思路吧。。。。

可以看做有一條上升的階梯將兩個點集分開。

那麼將點按x排序後,可以看做選一些權值上升的y值,使權值和最大。

枚舉每個點做爲階梯的最後一階的情況,

那麼加入一個點,由前面y值比他小的轉移來,線段樹維護一下最大值,

考慮這個點對前面點的影響,對y大於這個點的加bi,否則加ai。

#include <bits/stdc++.h>

using namespace std;
#define N 100005
#define go(i,a,b) for(int i=(a);i<=(b);i++)
#define dep(i,a,b) for(int i=(a);i>=(b);i--)
#define ll long long
#define ls i*2+1
#define rs i*2+2
#define mid (l+r)/2
#define lson l,mid,ls
#define rson mid+1,r,rs
#define root 0,m,0
ll t[N*4],lz[N*4];
struct no{
    int x,y,a,b;
    bool operator <(const no &a)const{
        return x==a.x?y>a.y:x<a.x;
    }
};no d[N];
int n,c[N];
void build(int l,int r,int i){
    t[i]=lz[i]=0;
    if(l==r)return;
    build(lson);build(rson);
}
void up(int i){
    if(lz[i]){
        t[ls]+=lz[i]; lz[ls]+=lz[i];
        t[rs]+=lz[i]; lz[rs]+=lz[i];
        lz[i]=0;
    }
}
void updata(int L,int R,int v,int l,int r,int i){
    if(L>R)return ;
    if(L<=l&&R>=r){t[i]+=v;lz[i]+=v;return ;} up(i);
    if(L<=mid)updata(L,R,v,lson);
    if(R>mid)updata(L,R,v,rson);
    t[i]=max(t[ls],t[rs]);
}
void inser(int pos,ll v,int l,int r,int i){
    if(l==r){t[i]=max(t[i],v); return ;} up(i);
    if(pos<=mid)inser(pos,v,lson);else inser(pos,v,rson);
    t[i]=max(t[ls],t[rs]);
}
ll query(int L,int R,int l,int r,int i){
    if(L<=l&&R>=r)return t[i]; up(i);
    return max(L<=mid?query(L,R,lson):0ll,R>mid?query(L,R,rson):0ll);
}
int main()
{
    while(scanf("%d",&n)!=EOF){
        go(i,1,n)scanf("%d%d%d%d",&d[i].x,&d[i].y,&d[i].a,&d[i].b),c[i]=d[i].y;
        sort(c+1,c+n+1);int m=unique(c+1,c+n+1)-(c+1);
        go(i,1,n)d[i].y=lower_bound(c+1,c+m+1,d[i].y)-c;
        sort(d+1,d+n+1); build(root);
        go(i,1,n){
            inser(d[i].y,query(0,d[i].y,root)+d[i].b,root);
            updata(0,d[i].y-1,d[i].a,root); updata(d[i].y+1,m,d[i].b,root);
        }
        printf("%lld\n",t[0]);
    }
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章