ハッカー、あなたの袋をパック!

C - ハッカー、あなたの袋をパック!

覚えているsort()機能です\(O(nlog(n)を )\) の複雑さを。

我々横断それぞれの旅が見つかりましたここでの旅、複雑さを軽減するために半分にできること予選始まるが、私たちは言葉を横断するために、この時点である場合、我々はまた、満足状態と旅の最大重量を見つける必要がありますである(O(N ^ 2)\ \) の複雑さは、複雑さを軽減し、どのような条件を満たすために、すべての位置でそれを見つけるために、前処理されたことには、この時間の必要性が最小に過ごすために必要な、。条件に沿ったものであるプロパティは、旅の同じ長さの場合には、旅は後日を開始することに留意すべきである、そして我々は、いつ戻って横断し、それを維持するために、単調なスタックを使用し、できる\(O (1)\)クエリ。

コード:

// Created by CAD on 2020/1/20.
#include <iostream>
#include <vector>
#include <algorithm>
#define inf 0x3f3f3f3f
#define INF 0x7fffffffffffffff
#define ll long long
using namespace std;

const int maxn=2e5+5;
struct node{
    int l,r;
    ll w;
    bool operator <(node &b)
    {
        return l<b.l;
    }
}nod[maxn];
vector<node> v[maxn];
vector<ll> w[maxn];
inline bool judge(node &a,node &b)
{
    return a.l>b.r;
}
int main()
{
    int n,x;    cin>>n>>x;
    ll ans=INF;
    for(int i=1;i<=n;++i)
    {
        int l,r;
        ll c;
        scanf("%d%d%lld",&l,&r,&c);
        nod[i]={l,r,c};
        v[r-l+1].push_back({l,r,c});
    }
    for(int i=1;i<=x;i++)
        sort(v[i].begin(),v[i].end());
    for(int i=1;i<=x;++i)
    {
        if(v[i].empty()) continue;
        w[i].push_back(v[i].back().w);
        for(int j=v[i].size()-2;j>=0;--j)
            w[i].push_back(min(w[i].back(),v[i][j].w));
    }
    for(int i=1;i<=n;++i)
    {
        int k=x-(nod[i].r-nod[i].l+1);
        if(k<1) continue;
        if(v[k].empty()) continue;
        else{
            int l=0,r=int(v[k].size())-1;
            int pos=inf;
            while(l<=r)
            {
                int mid=(l+r)>>1;
                if(judge(v[k][mid],nod[i])) pos=min(pos,mid),r=mid-1;
                else l=mid+1;
            }
            if(pos==inf) continue;
            ll minn=w[k][w[k].size()-pos-1];
            ans=min(ans,nod[i].w+minn);
        }
    }
    if(ans==INF) cout<<-1<<endl;
    else    cout<<ans<<endl;
    return 0;
}

おすすめ

転載: www.cnblogs.com/CADCADCAD/p/12227475.html