传送门:Codeforces 822C
题意:给出n组l r c,定义duration为r-l+1,找出两组使其duration之和为x,并且(l,r)不相交,求c之和最小是多少。
思路:一开始我按duration排序,然后二分瞎搞了半天,不是wa就是tle。。
正解:将输入的端点按大小排序,然后遍历,如果是右端点就更新num数组,如果是左端点就更新答案。
num[i]保存的是已经遍历过的完整区间里,duration为i的最小的c。
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
struct node{
int l,r,c,k,id;
}a[200005];
pair<int,int>p[400005];
int main()
{
memset(num,inf,sizeof(num));
int n,x,cnt=0;
cin>>n>>x;
for(int i=0;i<n;i++)
{
scanf("%d%d%d",&a[i].l,&a[i].r,&a[i].c);
a[i].k=a[i].r-a[i].l+1;
p[cnt++]=make_pair(a[i].l,-(i+1));
p[cnt++]=make_pair(a[i].r,i+1);
}
sort(p,p+cnt);
int ans=2000000001;
for(int i=0;i<cnt;i++)
{
if(p[i].second>0)
{
int id=p[i].second-1;
num[a[id].k]=min(num[a[id].k],a[id].c);
}
else
{
int id=(-p[i].second)-1;
int t=x-a[id].k;
if(num[t]!=inf&&t>=0)
ans=min(ans,num[t]+a[id].c);
}
}
if(ans==2000000001)
ans=-1;
cout<<ans<<endl;
}