8753: 指引
时间限制: 1 Sec 内存限制: 128 MB
提交: 38 解决: 14
[提交] [状态] [讨论版] [命题人:admin]
题目描述
Wake up, dead boy, enter adventureland. Tricksters, magicians will show you all that's real.
N 名迷途的旅者需要小 X 的指引。
初始时,每一名旅者 i 位于坐标(Ai,Bi)处,旅者们只能够向右或是向上移动,也就是说,他们只能够增加自己的某一维坐标,而不能减小它们。
这片大地上同样存在者 N 个出口,每一个出口 i 位于坐标(Ci,Di)处,一个出口一旦被某个旅者通过,它们就会一并消失。
请帮助小 X 计算他至多能够指引多少旅者离开这片大地。
输入
第一行一个整数Num,表示测试点编号,以便选手方便地获得部分分,你可能不需要用到这则信息,样例中Num的含义为数据范围与某个测试点相同。
接下来一行一个整数N,含义见题目描述。
接下来N行,每行两个整数Ai、Bi,表示每一名旅者的坐标。接下来N行,每行两个整数Ci、Di,表示每一个出口的坐标。
输出
一行一个整数,表示答案。
样例输入
复制样例数据
6
3
2 0
3 1
1 3
4 2
0 4
5 5
样例输出
2
提示
让位于(2,0)的旅者走到(4,2)处, 让位于(3,1)的旅者走到(5,5)处。
这个题怎么说呢,是水题,但是莫名卡了好久,最后看标程发现,似乎是错在坐标不能相等上了
标程里的记录方法也很优秀,自己写时没注意到坐标都小于2n
代码:
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
const int maxn = 1e6 + 100;
const int inf = 0x3f3f3f3f;
set<int> sett;
bool f[maxn];
int post[maxn];
int main() {
int t, n, x, y;
scanf("%d%d", &t, &n);
for (int i = 1; i <= n; i++) {
scanf("%d%d", &x, &y);
f[x] = 1;
post[x] = y;
}
for (int i = 1; i <= n; i++) {
scanf("%d%d", &x, &y);
f[x] = 0;
post[x] = y;
}
int cnt = 0;
for (int i = 0; i < 2 * n; i++) {
if (f[i]) sett.insert(post[i]);
else {
set<int>::iterator pos = sett.lower_bound(post[i]);
if (pos == sett.begin()) continue;
pos--;
cnt++;
sett.erase(pos);
}
}
printf("%d\n", cnt);
return 0;
}