第一次看到这个题目首先想到的就是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[n]);
return 0 ;
}
斜率优化想了一下,发现无法从后往前更新队列里面的无用点。
然后只有二分了。可是发现虽然线段我们可以按右端点排序使其具有单调性,但是dp值无法确定有单调性(orz)。
然后问了问网友,发现dp[i] = max(dp[i-1],dp[ans]+s[i].w) ;就可以使dp值具有单调性。因为端点具有单调性,所以值的单调性也可以成立。