codevs3037 线段覆盖5 离散化DP
2016-10-13 16:21
323 查看
题目
codevs3037 线段覆盖5题解
不懂某些人为什么要用BIT = = 。这样会带坏小朋友的啊喂(虽然说刷到大师了写个BIT就是一分钟的事)。不过你强行加个log会很慢的阿喂,何况这题的log大概是20。其实我写的也不好= =并没有1A而且错误还比较多dp[i]表示到离散化之后的端点i之前最大价值。然后把线段按右端点排序,然后转移方程是这样的
dp[i]=max( dp[ i - 1 ] , dp[ l [ k ] ] + val[ k ])
l是左端点 val是价值 这不就是个裸的背包吗???写背包的时候还写个BIT求最大值?并没有批判的意思啊只是觉得应该多想想。因为每条线段只会在右端点被枚举到一次,所以dp的时间复杂度是O(离散化后端点数+线段数)。所以这题主要复杂度在离散化上= =我离散写的比较拙劣。
代码
//QWsin #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int maxn=1000000+10; typedef long long ll; inline ll read() { ll ret=0;char ch=getchar(); while(ch<'0'||ch>'9') ch=getchar(); for(;ch>='0'&&ch<='9';ch=getchar()) ret=ret*10+ch-'0'; return ret; } ll x[maxn*2],dp[maxn*2]; struct Line{ ll l,r,val; bool operator < (const Line &rhs)const{ return r<rhs.r; } inline void input(){l=read();r=read();val=read();} }l[maxn]; int main() { int n=read(); for(int i=1;i<=n;i++) l[i].input(),x[i*2-1]=l[i].l,x[i*2]=l[i].r; sort(x+1,x+2*n+1); int m=unique(x+1,x+2*n+1)-x-1; for(int i=1;i<=n;i++) l[i].l=lower_bound(x+1,x+m+1,l[i].l)-x, l[i].r=lower_bound(x+1,x+m+1,l[i].r)-x; sort(l+1,l+n+1); int p=0; ll ans=0; for(int i=1;i<=m;i++) { dp[i]=dp[i-1]; while(p+1<=n&&l[p+1].r==i) { p++; dp[i]=max(dp[i],dp[l[p].l]+l[p].val); ans=max(ans,dp[i]); } } cout<<ans; return 0; }
相关文章推荐
- 【Codevs 3037】线段覆盖5
- codevs 3027 线段覆盖 2 解题报告 (序列型DP)
- CODEVS3037 线段覆盖 5[序列DP 二分]
- codevs3012 线段覆盖 4 dp好题
- Codevs_P3037 线段覆盖 5(DP+二分)
- [CODEVS 3037] 线段覆盖 5
- [CODEVS 3037] 线段覆盖 5
- codevs 3037 线段覆盖 5,codevs 3012 线段覆盖 4,codevs 3027 线段覆盖 2
- 线段覆盖(序列动态规划+离散化)
- 【codevs3012+codevs3037】线段覆盖4+线段覆盖5(DP)
- 【基础练习】【线性DP】codevs3027 线段覆盖2题解
- Codevs 3027 线段覆盖 2
- codevs 线段覆盖1~4
- Codevs_P1214 线段覆盖(贪心)
- codevs 3012 线段覆盖4
- CODEVS1643 线段覆盖3[贪心]
- codevs 3027 线段覆盖 2 (简单dp)
- codevs3027 线段覆盖2(DP)
- codevs 1214 线段覆盖
- codevs3027 线段覆盖2(DP)