codeforces 555b//Case of Fugitive// Codeforces Round #310(Div. 1)

Posted gaudar

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codeforces 555b//Case of Fugitive// Codeforces Round #310(Div. 1)相关的知识,希望对你有一定的参考价值。

题意:有n-1个缝隙,在上面搭桥,每个缝隙有个ll,rr值,ll<=长度<=rr的才能搭上去。求一种搭桥组合。

经典问题,应列入acm必背300题中。属于那种不可能自己想得出来的题。将二元组[ll,rr]排序(ll相同时再rr),长度x排序(升序)。一个全局优先队列pq(rr小的顶部)。for循环,对每个x,将ll比它小的放入优先队列pq,如果pq仍为空,说明这块桥用不上,不为空,看top的rr是否大于x,如果大于,这块桥就能用上,并且给当前的top一定是可行的。

乱码:

#pragma comment(linker,"/STACK:1024000000,1024000000") 
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<vector>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<algorithm>
#include <stack>
using namespace std;
const int SZ=2e5+10,INF=0x7FFFFFFF;
typedef long long lon;
lon match[SZ];

struct nd{
    lon ll,rr,id;
    nd(lon a=0,lon b=0):ll(a),rr(b){}
};

bool cmp(nd &x,nd &y)
{
    if(x.ll!=y.ll)return x.ll<y.ll;
    else return x.rr<y.rr;
}

struct ope{
    const bool operator()(nd &x,nd &y)const
    {
        return x.rr>y.rr;
    }
};

struct bn{
    lon val,id;
    bn(lon a=0,lon b=0):val(a),id(b){}
    bool operator<(bn &other)
    {
        return val<other.val;
    }
};

int main()
{
    std::ios::sync_with_stdio(0);
    lon n,m;
    cin>>n>>m;
    vector<nd> vct,src;
    for(lon i=0;i<n;++i)
    {
        nd tmp;
        cin>>tmp.ll>>tmp.rr;
        src.push_back(tmp);
    }
    for(lon i=1;i<n;++i)
    {
        nd tmp(src[i].ll-src[i-1].rr,src[i].rr-src[i-1].ll);
        tmp.id=i-1;
        vct.push_back(tmp);
    }
    sort(vct.begin(),vct.end(),cmp);
    vector<bn> bge;
    for(lon i=0;i<m;++i)
    {
        lon tmp;
        cin>>tmp;
        bge.push_back(bn(tmp,i));
    }
    sort(bge.begin(),bge.end());
    priority_queue<nd,vector<nd>,ope> pq;
    vector<lon> res;
    for(lon i=0,j=0;i<m;++i)
    {
        lon cur=bge[i].val;
        for(;j<n-1;++j)
        {
            if(vct[j].ll<=cur)
            {
                pq.push(vct[j]);
            }
            else break;
        }
        if(pq.empty())
        {
            continue;
        }
        nd top=pq.top();
        if(top.rr<cur)
        {
        }
        else
        {
            pq.pop();
            match[top.id]=bge[i].id+1;
        }
    }
    bool ok=1;
    for(lon i=0;i<n-1;++i)
    {
        //cout<<"mt: "<<match[i]<<endl;
        if(match[i]==0)ok=0;
    }
    if(ok)
    {
        cout<<"Yes"<<endl;
        for(lon i=0;i<n-1;++i)
        {
            if(i)cout<<" ";
            cout<<match[i];
        }
        cout<<endl;
    }
    else cout<<"No"<<endl;
    return 0;
}

 

以上是关于codeforces 555b//Case of Fugitive// Codeforces Round #310(Div. 1)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #555 (Div. 3)

Codeforces Round #555 Div. 3

E Minimum Array ( Codeforces Round #555 (Div. 3) )

Codeforces Round #555 div3 C2

Codeforces Round #555 (Div. 3)[1157]题解

Codeforces Round # 555 (Div. 3) C2. Increasing subsequence (complicated version) (贪心)