您的位置:首页 > 其它

Hacker, pack your bags! CodeForces - 822C

2017-10-11 10:36 288 查看
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
#include <stack>
#include <bitset>
#include <cstdlib>
#include <cmath>
#include <set>
#include <list>
#include <deque>
#include <map>
#include <queue>
using namespace std;
typedef long long ll;
#define maxn 200010

struct node{
int l;
int r;
int cost;
}voc[maxn];
bool cmp (node a,node b){
if (a.l==b.l) return a.r < b.r;
return a.l < b.l;
}
map <int,int > mp;
vector <node> g[maxn];
vector <int> gs[maxn];
int midquery (int x,int ll){
int t = mp[x];
//printf("%d %d\n",x,t);
if (!t) return -1;
int r = g[t].size()-1;
int l = 0;
int ans=0;
while (r>=l){
int mid = (r+l)/2;
int L = g[t][mid].l;
if (L > ll) {r= mid-1;ans =mid;}
else l =mid+1;
}
if (ans)return r;
else return -1;
}
int main (){
int n,x;
scanf ("%d%d",&n,&x);
int i;
for (i=1;i<=n;i++){
scanf ("%d%d%d",&voc[i].l,&voc[i].r,&voc[i].cost);
}
sort (voc+1,voc+1+n,cmp);
int t = 0;
for (i=1;i<=n;i++){
int d= voc[i].r-voc[i].l+1;
if (!mp[d]) mp[d] = ++t;
int p = mp[d];
g[p].push_back (voc[i]);
gs[p].push_back (1);
}

int j;
for (i=1;i<=t;i++){
int l = gs[i].size()-1;
gs[i][l]  = g[i][l].cost ;
for (j=l-1 ;j>=0;j--){
gs[i][j]= min (gs[i][j+1],g[i][j].cost);
}
}
ll ans = 2e9+7;
for (i=1;i<n;i++){
int d  = x - (voc[i].r-voc[i].l+1);
int t = midquery (d,voc[i].r);
//    printf("%d\n",t);
if (t==-1) continue;
ll res =0;
res = gs[mp[d]][t] + voc[i].cost;
if (ans > res) ans = res;
}
if (ans==2e9+7) printf("-1\n");
else cout <<ans<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: