2018曹文夏令营day4 指引 思维

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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值