Codeforces 556D - Case of Fugitive

556D - Case of Fugitive

思路:将桥长度放进二叉搜索树中(multiset),相邻两岛距离按上限排序,然后二分查找桥长度匹配并删除。

代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=2e5+5;
struct node
{
    ll x;
    ll y;
    int id;
    bool  operator <(const node &a)const
    {
        return y<a.y;
    }
}l[N],b[N];
struct Node
{
    ll x;
    int id;
    bool operator <(const Node &a)const
    {
        return x<a.x;
    }
}a[N];
int ans[N];
multiset<Node>ss;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n,m;
    cin>>n>>m;
    cin>>b[0].x>>b[0].y;
    for(int i=1;i<n;i++)
    {
        cin>>b[i].x>>b[i].y;
        l[i-1].x=b[i].x-b[i-1].y;
        l[i-1].y=b[i].y-b[i-1].x;
        l[i-1].id=i;
    }
    for(int i=0;i<m;i++)
    {
        cin>>a[i].x;
        a[i].id=i+1;
        ss.insert(a[i]);
    }
    sort(l,l+n-1);
    for(int i=0;i<n-1;i++)
    {
        auto it=ss.lower_bound(Node{l[i].x,0});
        if(it==ss.end())
        {
            cout<<"No"<<endl;
            return 0;
        }
        if(it->x<=l[i].y)
        {
            ans[l[i].id]=it->id;
            ss.erase(it);
        }
        else
        {
            cout<<"No"<<endl;
            return 0;
        }
    }
    cout<<"Yes"<<endl;
    for(int i=1;i<n-1;i++)
    cout<<ans[i]<<" ";
    cout<<ans[n-1]<<endl;
    return 0;
} 
时间: 2024-11-08 06:46:12

Codeforces 556D - Case of Fugitive的相关文章

CodeForces - 556D Case of Fugitive (贪心+排序)

Andrewid the Android is a galaxy-famous detective. He is now chasing a criminal hiding on the planet Oxa-5, the planet almost fully covered with water. The only dry land there is an archipelago of n narrow islands located in a row. For more comfort l

codeforces 555B Case of Fugitive

题目连接: http://codeforces.com/problemset/problem/555/B 题目大意: 有n个岛屿(岛屿在一列上,可以看做是线性的,用来描述岛屿位置的是起点与终点),m个桥,给出每个岛屿的位置和桥的长度,问是否可以把n个岛屿连起来? 解题思路: 排序+贪心,对于n个岛屿,相邻的两个之间起点和端点可以转化为n-1个连接桥的长度区间,把区间升序排列. 对于m个桥升序排列,对于每一个桥枚举每个可以合法覆盖的区间,选取最优的,选取的时候满足L<bridge_length<

Codeforces 555B - Case of Fugitive 搭桥

题意:给出n段路和m座桥.每段路的两个端点一维坐标表示.要从m座桥中选出一些桥搭在每两条相邻的路上,使得这些路全部连通.每两条相邻的路之间只能搭一座桥,且桥的两端必须恰好分别落在两段路上.如果存在一种搭桥方法,则输出Yes并按题目给定的路形成的空隙的顺序输出每座桥的序号,若不能则输出No. 题意换个说法实际上就是给定n - 1个区间和m个数,问是否能从m个数中选出n - 1个数,恰好分别落在n - 1个区间内. 觉得可以用贪心做,开始想了下因为区间有两个端点,而且位置任意,有点不好处理.后来就想

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 co

Round 310(Div.1) B. Case of Fugitive

Round 310(Div.1) B. Case of Fugitive Andrewid the Android is a galaxy-famous detective. He is now chasing a criminal hiding on the planet Oxa-5, the planet almost fully covered with water. The only dry land there is an archipelago of n narrow islands

codeforces 556 D Case of Fugitive

这个题很显然,可以转换成这个问题: 有n-1个区间,m个数, 每个数最多只能用一次,第i个数只要能被第j个区间包含,那么这个数就可以放入这个区间内. 求出,当所有区间里都恰有一个数时的情况. 我们把所有区间按照下限升序排序,所有数升序排序之后分治即可. 分治过程,维护一个元素为区间的小堆,堆顶是上限最小的区间. 考虑第i个数,把所有能够包含它的区间都丢到堆中,然后从堆中丢一个区间出来,若这个区间可以包含这个数,那么记录下来,否则无解,结束程序. 为什么此时无解呢?因为很显然后面的数都不小于这个数

CodeForces - 556C Case of Matryoshkas

Andrewid the Android is a galaxy-famous detective. He is now investigating the case of vandalism at the exhibition of contemporary art. The main exhibit is a construction of n matryoshka dolls that can be nested one into another. The matryoshka dolls

codeforces 556B. Case of Fake Numbers 解题报告

题目链接:http://codeforces.com/problemset/problem/556/B 题目意思:给出 n 个齿轮,每个齿轮有 n 个 teeth,逆时针排列,编号为0 ~ n-1.每按一次 button,每个齿轮都会有且仅有一个活动的tooth,对于偶数编号的齿轮,它下一个活动tooth是紧挨着当前tooth的逆时针方向的那个:而奇数编号的齿轮,下一个活动tooth是顺时针的那个.给出每个齿轮的活动tooth,问通过按下有限次的button,问能不能得到一个0,1,...,n-

#310 (div.2) D. Case of Fugitive

1.题目描述:点击打开链接 2.解题思路:本题利用贪心法+优先队列解决.不过本题的贪心策略的选取是关键,有些看似正确的贪心策略实际上暗含危险.先说说正确的贪心策略:将所有的岛按照顺序求出第i个岛和i+1个岛之间桥的最小最大长度,并按照L从小到大排序,若相同则按照R从小到大排序.然后对桥由小到大排序,将所有的桥扫描一遍,枚举第i个桥时,将L值小于等于当前桥的区间按照(R,id)放入优先队列,R小的在队首,大的在队尾,每次看队首的R是否大于等于len,若满足,则记录答案,break,若不存在,则无解