Hacker, pack your bags! CodeForces - 822C

#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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章