codevs3012 线段覆盖 4 dp好题
2014-11-07 09:18
239 查看
第一次看到这个题目首先想到的就是dp。
然后发现范围是100w,肯定是nlogn或更小。#include<cstdio>
#include<algorithm>
using namespace std;
#define maxn 1100000
typedef long long sint;
struct node
{
int a,b,w;
}s[maxn] ;
sint dp[maxn] ;
bool cmp(node x,node y)
{
return x.b < y.b ;
}
int getint()
{
char c;
int res;
while(c=getchar(),c<'0'||c>'9');
res=c-'0';
while(c=getchar(),c>='0'&&c<='9')
res=res*10+c-'0';
return res;
}
int main()
{
int n ;
scanf("%d",&n) ;
for(int i = 1 ; i <= n ; i++)
{
s[i].a=getint();
s[i].b=getint();
s[i].w=getint();
}
sort(s+1,s+n+1,cmp) ;
int ll,rr,mid,ans;
for(int i = 1 ; i <= n ; i++)
{
ll=1;
rr=i;
ans=0;
while(ll<=rr)
{
mid=(ll+rr)>>1;
if(s[mid].b<=s[i].a)
{
ans=mid;
ll=mid+1;
}
else
{
rr=mid-1;
}
}
dp[i] = max(dp[i-1],dp[ans]+s[i].w) ;
}
printf("%lld",dp
);
return 0 ;
}
斜率优化想了一下,发现无法从后往前更新队列里面的无用点。
然后只有二分了。可是发现虽然线段我们可以按右端点排序使其具有单调性,但是dp值无法确定有单调性(orz)。
然后问了问网友,发现dp[i] = max(dp[i-1],dp[ans]+s[i].w) ;就可以使dp值具有单调性。因为端点具有单调性,所以值的单调性也可以成立。
然后发现范围是100w,肯定是nlogn或更小。#include<cstdio>
#include<algorithm>
using namespace std;
#define maxn 1100000
typedef long long sint;
struct node
{
int a,b,w;
}s[maxn] ;
sint dp[maxn] ;
bool cmp(node x,node y)
{
return x.b < y.b ;
}
int getint()
{
char c;
int res;
while(c=getchar(),c<'0'||c>'9');
res=c-'0';
while(c=getchar(),c>='0'&&c<='9')
res=res*10+c-'0';
return res;
}
int main()
{
int n ;
scanf("%d",&n) ;
for(int i = 1 ; i <= n ; i++)
{
s[i].a=getint();
s[i].b=getint();
s[i].w=getint();
}
sort(s+1,s+n+1,cmp) ;
int ll,rr,mid,ans;
for(int i = 1 ; i <= n ; i++)
{
ll=1;
rr=i;
ans=0;
while(ll<=rr)
{
mid=(ll+rr)>>1;
if(s[mid].b<=s[i].a)
{
ans=mid;
ll=mid+1;
}
else
{
rr=mid-1;
}
}
dp[i] = max(dp[i-1],dp[ans]+s[i].w) ;
}
printf("%lld",dp
);
return 0 ;
}
斜率优化想了一下,发现无法从后往前更新队列里面的无用点。
然后只有二分了。可是发现虽然线段我们可以按右端点排序使其具有单调性,但是dp值无法确定有单调性(orz)。
然后问了问网友,发现dp[i] = max(dp[i-1],dp[ans]+s[i].w) ;就可以使dp值具有单调性。因为端点具有单调性,所以值的单调性也可以成立。
相关文章推荐
- codevs 3027 线段覆盖 2 解题报告 (序列型DP)
- [CodeVS3012]线段覆盖4(DP+二分)
- codevs 3012 线段覆盖4(dp+二分优化)
- 【codevs 3012】线段覆盖 4
- codevs 3012 线段覆盖4
- codevs3037 线段覆盖5 离散化DP
- codevs 3037 线段覆盖 5,codevs 3012 线段覆盖 4,codevs 3027 线段覆盖 2
- Codevs_P3037 线段覆盖 5(DP+二分)
- 线段覆盖系列(dp+贪心)
- 【基础练习】【线性DP】codevs3027 线段覆盖2题解
- Code[vs] 3027 线段覆盖 2(dp求和)
- [CODEVS 3037] 线段覆盖 5
- codevs 1214 线段覆盖(贪心 or dp)
- 【Codevs 3027】线段覆盖2
- codevs 1214 线段覆盖
- codeVS 1214 线段覆盖
- codevs3027 线段覆盖2(DP)
- CODEVS1643 线段覆盖3[贪心]
- 【codevs 1643】线段覆盖 3
- codevs3027 线段覆盖2(DP)