• CodeForces


    pro: 从左到有有N个车道,都有一定程度损坏,所以有不同的修理费a[]; 有M场比赛,每场比赛的场地是[Li,Ri],即如果这个区间的车道都被修理好,则可以举办这个比赛,并且收益是Pi。问最多得到多少收益。N,M<2e5;

    sol: 比较明显的右端点排序,求最大DP问题。  dp[i]表示只考虑修前i条路的最大收益,那么dp[i]=max(dp[j]+P(j+1,i)-a(j+1,i));

    P(i,j)表示这个区间的收益,a(i,j)表示这个区间的修理费。 考虑无后效性,我们按右端点排序,然后从1到N模拟修路,每个点的左边区间减去修理费,遇到比赛的右端点,在左区间加上收益。 一直更新即可。

    #include<bits/stdc++.h>
    #define ll long long
    #define rep(i,a,b) for(int i=a;i<=b;i++)
    using namespace std;
    const int maxn=200010;
    struct in{
        int L,R,P;
        friend bool operator <(in w,in v){ return w.R<v.R; }
    }s[maxn];
    ll a[maxn],lazy[maxn<<2],mx[maxn<<2],dp[maxn];
    void pushdown(int Now)
    {
        if(lazy[Now]) {
            lazy[Now<<1]+=lazy[Now];
            lazy[Now<<1|1]+=lazy[Now];
            mx[Now<<1]+=lazy[Now];
            mx[Now<<1|1]+=lazy[Now];
            lazy[Now]=0;
        }
    }
    void add(int Now,int L,int R,int l,int r,ll val)
    {
        if(l<=L&&r>=R){
            mx[Now]+=val; lazy[Now]+=val;
            return ;
        }
        pushdown(Now);
        int Mid=(L+R)>>1;
        if(l<=Mid) add(Now<<1,L,Mid,l,r,val);
        if(r>Mid) add(Now<<1|1,Mid+1,R,l,r,val);
        mx[Now]=max(mx[Now<<1],mx[Now<<1|1]);
    }
    ll query(int Now,int L,int R,int l,int r)
    {
        if(l<=L&&r>=R) return mx[Now];
        int Mid=(L+R)>>1; ll res=0; pushdown(Now);
        if(l<=Mid) res=max(res,query(Now<<1,L,Mid,l,r));
        if(r>Mid) res=max(res,query(Now<<1|1,Mid+1,R,l,r));
        mx[Now]=max(mx[Now<<1],mx[Now<<1|1]);
        return res;
    }
    int main()
    {
        int N,M;
        scanf("%d%d",&N,&M);
        rep(i,1,N) scanf("%d",&a[i]);
        rep(i,1,M) scanf("%d%d%d",&s[i].L,&s[i].R,&s[i].P);
        sort(s+1,s+M+1);
        int p=0;
        rep(i,1,N) {
            add(1,0,N,0,i-1,-a[i]);
            while(p+1<=M&&s[p+1].R<=i) p++,add(1,0,N,0,s[p].L-1,s[p].P);
            dp[i]=max(query(1,0,N,0,i-1),dp[i-1]);
            add(1,0,N,i,i,dp[i]);
        }
        printf("%lld
    ",dp[N]);
        return 0;
    }
  • 相关阅读:
    能大大提升工作效率和时间效率的9个重要习惯
    hibernate的校验
    8. semahpore原理
    chklist
    android textview 自动换行 整齐排版
    fiddler接口测试,js代码修改日志展示(埋点用)
    Python模块之 tqdm进度条
    Python抓取网页到本地
    Python模块之 clint 进度条
    python windows下pip安装错误whl文件安装错误
  • 原文地址:https://www.cnblogs.com/hua-dong/p/10852520.html
Copyright © 2020-2023  润新知