您的位置:首页 > 其它

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值具有单调性。因为端点具有单调性,所以值的单调性也可以成立。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: