【codevs 3012】线段覆盖 4

来源:互联网 发布:c语言冒泡排序简单代码 编辑:程序博客网 时间:2024/05/16 08:50

o(nlogn)

我的做法是dp+二分

不知道数据结构维护会不会T


二分有几点要注意

pos初值 = 0

L = 1,R = i或i-1

更新是     dp[i] = max(dp[i-1],dp[pos]+e[i].w);     
不是    dp[i] = max(dp[i],dp[pos]+e[i].w);

     

#include<bits/stdc++.h>    using namespace std;    #define Rep(i,a,b) for(int i=(a);i<=(b);i++)    inline void get(int& x){char c=getchar();for(x=0;!isdigit(c);c=getchar());for(;isdigit(c);x=x*10+c-'0',c=getchar());}int n;typedef long long LL;  #define maxn 1000010    struct Seg{        int l,r,w;    }e[maxn];    LL dp[maxn];  bool cmp(Seg x,Seg y){        return x.r==y.r?x.l<y.l:x.r<y.r;}    int main()    {      get(n);        Rep(i,1,n)get(e[i].l),get(e[i].r),get(e[i].w);        sort(e+1,e+1+n,cmp);        for(int i=1;i<=n;i++)dp[i] = e[i].w;      Rep(i,2,n)        {    int pos = 0,L=1,R=i-1,mid;while(L<=R){mid = (L+R)>>1;if(e[mid].r<=e[i].l){pos = mid;L = mid+1;}else{R = mid-1;}}dp[i] = max(dp[i-1],dp[pos]+e[i].w);          }      cout<<dp[n];        return 0;    }    


0 0