题目链接:
http://codeforces.com/problemset/problem/822/C
题解:
本来的思路是二分,但是无奈自己的代码能力太弱,T在第44个上。看了网上大神的代码感触颇深,自己还是太弱了。
代码:
#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define met(a,b) memset(a,b,sizeof(a))
#define inf 1e18
const int maxn=2*1e5+10;
typedef long long int LL ;
vector<pair<LL,LL> >ll[maxn],rr[maxn];
LL cnt[maxn];
int main()
{
int n,x;
scanf("%d%d",&n,&x);
for(int i=0;i<n;i++)
{
int l,r,cost;
scanf("%d%d%d",&l,&r,&cost);
ll[l].push_back(make_pair(r-l+1,cost));
rr[r].push_back(make_pair(r- l+1,cost));
}
for(int i=1;i<=200000;i++)
cnt[i]=inf;
LL ans=inf;
for(int i=1;i<=200000;i++)// 点在线段上的暴力更新*******
{
for(int j=0;j<ll[i].size();j++)//ll在前,能选择的只有在之前就更新好的值。因此,不会出现重合的状态。
{
int z1=ll[i][j].first;
int z2=x-z1;
if(z2<=0)
continue;
if(cnt[z2]!=inf)
ans=min(ans,cnt[z2]+ll[i][j].second);
}
for(int j=0;j<rr[i].size();j++)//rr在后,只有rr更新当前区间的值
{
int z1=rr[i][j].first;
cnt[z1]=min(cnt[z1],rr[i][j].second);
}
}
if(ans==inf)
printf("-1\n");
else
cout<<ans<<endl;
}