题意:按顺序给出多个互不相交的区间(表示一些小岛),和一些可以连接区间的桥,每个桥有固定的长度。区间和桥的数量都是2*10^5。

两个相邻的小岛之间的桥的长度必须小于等于最远点距离,大于等于最近点距离。问是否能用这些桥把所有小岛连接在一起。

分析:区间排序问题。但是这个题里需要排序的区间并不是题里直接给出的小岛。而是要先把桥从小到大排序。

然后对于每两个相邻小岛,在这个桥的序列里都有一个区间内的桥是可以用来连接这两个小岛的。

对于每两个相邻小岛,求出其对应的桥区间,然后把这些区间排序。

排序规则是先按右边缘从小到大,右边相同的按左边缘从小到大。

排序后依次在这些区间里选取对应的桥,每次选取区间内最小的未被使用的桥即可。

至于排序的时候为什么先又后左,是因为不同区间对于左侧的桥资源的迫切程度,肯定是右边缘越偏左,需求越迫切。

所以应当优先将左侧的资源分配给右边缘比较偏左的区间。

要求一个数字集合里面位于一个区间内的最小值,可以用lower_bound函数。

而依次删除使用过的桥,可以用multiset(它有lower_bound这个成员函数)。

当想要使用包含三个值的结构体的时候,可以用两个pair嵌套。

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
using namespace std; #define d(x) const int MAX_N = * (int)(1e5) + ; pair<long long, long long> island[MAX_N];
int bridge_num;
int island_num;
int ans[MAX_N];
pair<long long, pair<long long, int> > range[MAX_N];
multiset<pair<long long, int> > bridge; bool ok()
{
for (int i = ; i < island_num - ; i++)
{
long long l = range[i].second.first;
long long r = range[i].first;
__typeof(bridge.begin()) it = bridge.lower_bound(make_pair(l, -));
if (it == bridge.end())
return false;
if ((*it).first > r)
return false;
ans[range[i].second.second] = it->second;
bridge.erase(it);
}
return true;
} void input()
{
scanf("%d%d", &island_num, &bridge_num);
for (int i = ; i < island_num; i++)
{
long long a, b;
cin >> a >> b;
island[i] = make_pair(a, b);
}
for (int i = ; i < bridge_num; i++)
{
long long a;
cin >> a;
bridge.insert(make_pair(a, i));
}
} int main()
{
input(); for (int i = ; i < island_num - ; i++)
{
long long min_len = island[i + ].first - island[i].second;
long long max_len = island[i + ].second - island[i].first;
range[i] = make_pair(max_len, make_pair(min_len, i));
} sort(range, range + island_num - ); if (ok())
{
puts("Yes");
for (int i = ; i < island_num - ; i++)
{
if (i != )
putchar(' ');
printf("%d", ans[i] + );
}
putchar('\n');
}
else
puts("No");
return ;
}

cf555b的更多相关文章

  1. CF555B 贪心

    http://codeforces.com/problemset/problem/555/B B. Case of Fugitive time limit per test 3 seconds mem ...

  2. CF555B Case of Fugitive

    题目大意 有一些不相交线段和一些桥,桥可以架在两个相邻的线段上.求现有的桥是否可以使所有线段连通. 题解 在两个线段上架桥,桥的长度在一个范围内,相当于一个长度的区间,一个桥只有一个长度,相当于一个长 ...

随机推荐

  1. jquery取消选择select下拉框

    有三个select下拉框一个大类,两个小类隐藏,需要在选择大类的时候,小类显示同时清除另外的小类选择的项这需求有点儿.......... 下面是三个select: <select name=&q ...

  2. Asp.Mvc中的text实现 辅助用户输入 灰色字体

    在开发Web应用程序中经常需要用户在文本框输入信息,为了提高程序人性化设置以及用户体验效果常常需要在文本框中显示灰色字体辅助用户输入 如:

  3. Spring利用JDBCTemplate实现批量插入和返回id

    1.先介绍一下java.sql.Connection接口提供的三个在执行插入语句后可取的自动生成的主键的方法: //第一个是 PreparedStatement prepareStatement(St ...

  4. R语言画图实例-参考R语言实战

    dose <- c(, , , ,) drugA <- c(, , , , ) drugB <- c(, , , , ) # 数据准备 opar <- par(no.reado ...

  5. jQuery属性选择器.attr()和.prop()两种方法

    在判断表单单选框是否被选中时,通常会想到使用$('#checkbox').attr('checked')来判断,但在一些情况下,你会发现这种方法并不管用,得到的是undefined. 原来jQuery ...

  6. Java 中JOptionPane的基本使用方法

    JOptionPane 有助于方便地弹出要求用户提供值或向其发出通知的标准对话框.但是有时候看看API也特别烦,因为方法多,参数多,特别难记忆.这里我给出几种常用的方法供大家参考. (1) publi ...

  7. iOS9 Universal Link实现

    先来贴几个比较全面的帖子,看完就差不多了. 1   iOS 9 通用链接(Universal Links) 帖子注意项非常重要,仔细阅读. 自己补充几点: 1 服务器上配置的json文件apple-a ...

  8. 在PHP中$_SESSION的使用方法

    使用PHP应用session时,将session中的数据存储在服务器上,然后通过客户端传来的sessionID识别客户端的信息,并提取信息. php中的session的常用操作:session的写入. ...

  9. Swift语法入门

    正文参考: https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Progra ...

  10. Android高仿微信(一)——如何消除启动时的白屏

    默认情况下,APP启动时会先把屏幕刷成白色,然后才绘制第一个Activity中的View,这两个步骤之间的延迟会造成启动后先看到白屏(时间大概为1秒左右).时间不长,但是我们也看到,一般的APP时不存 ...