洛谷P3028 [USACO10OCT]汽水机Soda Machine
? 解题记录 ? ? 洛谷 ? ? 差分 ?    2017-11-23 11:19:37    597    0    0



题目描述

To meet the ever-growing demands of his N (1 <= N <= 50,000) cows, Farmer John has bought them a new soda machine. He wants to figure out the perfect place to install the machine.

The field in which the cows graze can be represented as a one-dimensional number line. Cow i grazes in the range A_i..B_i (1 <= A_i <= B_i; A_i <= B_i <= 1,000,000,000) (a range that includes its endpoints), and FJ can place the soda machine at any integer point in the range 1..1,000,000,000. Since cows are extremely lazy and try to move as little as possible, each cow would like to have the soda machine installed within her grazing range.

Sadly, it is not always possible to satisfy every cow's desires. Thus FJ would like to know the largest number of cows that can be satisfied.

To demonstrate the issue, consider four cows with grazing ranges 3..5, 4..8, 1..2, and 5..10; below is a schematic of their grazing ranges:

         1   2   3   4   5   6   7   8   9  10  11  12  13
         |---|---|---|---|---|---|---|---|---|---|---|---|-...
                 aaaaaaaaa
                     bbbbbbbbbbbbbbbbb
         ccccc           ddddddddddddddddddddd

As can be seen, the first, second and fourth cows share the point 5, but the third cow's grazing range is disjoint. Thus, a maximum of 3 cows can have the soda machine within their grazing range.

有N个人要去膜拜JZ,他们不知道JZ会出现在哪里,因此每个人有一个活动范围,只要JZ出现在这个范围内就能被膜拜,

伟大的JZ当然希望膜拜他的人越多越好,但是JZ不能分身,因此只能选择一个位置出现,他最多可以被多少人膜拜呢,

这个简单的问题JZ当然交给你了

输入输出格式

输入格式:

 

  • Line 1: A single integer: N

  • Lines 2..N+1: Line i+1 contains two space-separated integers: A_i and B_i

 

输出格式:

 

  • Line 1: A single integer representing the largest number of cows whose grazing intervals can all contain the soda machine.

 

输入输出样例

输入样例#1: 复制
4 
3 5 
4 8 
1 2 
5 10
输出样例#1: 复制
3

说明

If the soda machine is placed at location 5, cows 1, 2, and 4 can be satisfied. It is impossible to satisfy all four cows.

此题因为数据量大,差分需要离散化。我们可以把每一个端点存为结构体(左端附权值1,右端位置+1处附权值-1)。然后将所有端点都按出现的位置从前到后排序。for循环统计整个数组即可。

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 5e4 + 5;
typedef pair<int, int > pii;
int n, l, r, cnt, ans, mx;
pii pos[maxn << 1];

int main() {
    scanf("%d", &n);
    for(register int i = 1; i <= n; ++i) {
        scanf("%d%d", &l, &r);
        pos[++cnt] = make_pair(l, 1);
        pos[++cnt] = make_pair(r + 1, -1);
    }
    sort(pos + 1, pos + cnt + 1);
    for(register int i = 1; i <= cnt; ++i) {
        while(pos[i].first == pos[i + 1].first) 
            ans += pos[i++].second;
        ans += pos[i].second;
        mx = max(mx, ans);
    }
    printf("%d", mx);
    return 0;
}


上一篇: SGU411 Petya the Hero

下一篇: BZOJ3676: [Apio2014]回文串

597 人读过
立即登录, 发表评论.
没有帐号? 立即注册
0 条评论
文档导航