第一次两个小时内做三道题。。不过比赛结束重测后,这题超时了
我是按照r-l+1升序排序,如果r-l+1相等,则按照cost升序排序。然后从头扫一遍,扫的时候二分查找到与当前的duration1相加等于x的那个duration2,然后再把符合条件的duration2扫一遍。因为cost升序排序,所以一旦找到符合条件的duration2,后边的就不用管了。这是我思路。。。。
我看了下别人提交的代码,找了好几个才找到一个用二分做的:按照r-l+1升序排序,如果r-l+1相等,按照r升序排序。然后直接二分搜索确定到具体的花费。具体看代码。。
#include <bits/stdc++.h>
using namespace std;
struct node
{
int l,r,cost,der,mincost;
};
const int MAXN = 2e5+10;
node ns[MAXN];
int n,x;
bool cmp(const node& a, const node& b)
{
if(a.der == b.der)
return a.r < b.r;
return a.der < b.der;
}
int BS(int l, int r, int rp)
{
int mid;
int ans = INT_MAX;
while(l <= r)
{
mid = (l+r) >> 1;
if(ns[rp].der+ns[mid].der < x)
l = mid+1;
else if(ns[rp].der + ns[mid].der == x)
{
if(ns[rp].l <= ns[mid].r)
r = mid-1;
//ns[rp].l > ns[mid].r
else
{
l = mid+1;
ans = min(ans,ns[rp].cost+ns[mid].mincost);
}
}
else
r = mid-1;
}
return ans;
}
int main()
{
scanf("%d %d",&n,&x);
for(int i = 0; i < n; ++i)
{
scanf("%d %d %d",&ns[i].l,&ns[i].r,&ns[i].cost);
ns[i].der = ns[i].r - ns[i].l + 1;
ns[i].mincost = ns[i].cost;
}
sort(ns,ns+n,cmp);
for(int i = 0; i < n; ++i)
{
if(i > 0 && ns[i].der == ns[i-1].der)
ns[i].mincost = min(ns[i].mincost,ns[i-1].mincost);
}
int ansCost = INT_MAX;
for(int i = 0; i < n; ++i)
ansCost = min(BS(0,n-1,i),ansCost);
if(ansCost == INT_MAX)
printf("-1\n");
else
printf("%d\n",ansCost);
return 0;
}