• P3028 [USACO10OCT]汽水机Soda Machine


    题意翻译

    为了满足fj所有的N(1<=n<=50000)头奶牛的需求,fj新买了一台汽水机。他想找到一个最完美的位置来安放它。

    奶牛的牧场可以被表示为一个一维数轴,第i个奶牛被放牧的区间是[Ai...Bi](包含端点),fj可以把汽水机放在[1..1,000,000,000]。

    因为奶牛们都懒得要死,她们想尽可能的少移动。她们希望汽水机被放在自己的放牧区间内。

    遗憾的是,fj并不总能满足所有奶牛的要求,所以他想请你帮忙算出他能满足的奶牛数目

    题目描述

    To meet the ever-growing demands of his N (1 &lt;= N &lt;= 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 &lt;= A_i &lt;= B_i; A_i &lt;= B_i &lt;= 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.

    作为一个被两遍题目翻译弄昏了头脑的人,我建了一棵树算。。。。。。

    事后诸葛亮,突然发现这是一道差分数组的裸体

    佛了。。。。。。。

    30行代码和100代码

    楼在哪,我想跳一下。。。。。。

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <list>
    using namespace std;
    const int MAXN=500005;
    struct Node
    {
        int left,right;
        int lazy;
    }t[2*MAXN];
    int n,a[MAXN],b[MAXN],c[2*MAXN],size;
    list<int> lst;
    list<int>::iterator it;
    
    void buildtree()
    {
        int ln=1;
        while(ln<size) ln*=2;
        for(int i=ln; i<=ln*2; i++)
        {
            t[i].left=t[i].right=i-ln+1;
            t[i].lazy=0;
        }
        for(int i=ln-1; i>=1; i--)
        {
            t[i].left=t[i<<1].left;
            t[i].right=t[i<<1|1].right;
            t[i].lazy=0;
        }
    }
    void change(int id,int l,int r)
    {
        if(t[id].left==l && t[id].right==r)
        {
            t[id].lazy++;
            return;
        }
        if(t[id].lazy!=0)
        {
            t[id<<1].lazy+=t[id].lazy;
            t[id<<1|1].lazy+=t[id].lazy;
            t[id].lazy=0;
        }
        if(t[id<<1].right>=r) change(id<<1,l,r);
        else if(t[id<<1|1].left<=l) change(id<<1|1,l,r);
        else
        {
            change(id<<1,l,t[id<<1].right);
            change(id<<1|1,t[id<<1|1].left,r);
        }
    }
    
    void pushdown(int id)
    {
        if(t[id].left==t[id].right) return;
        if(t[id].lazy!=0)
        {
            t[id<<1].lazy+=t[id].lazy;
            t[id<<1|1].lazy+=t[id].lazy;
            t[id].lazy=0;
        }
        pushdown(id<<1);
        pushdown(id<<1|1);
    }
    int query()
    {
        pushdown(1);
        int ans=-1,ln=1;
        while(ln<size) ln*=2;
        for(int i=ln; i<ln*2; i++) ans=max(ans,t[i].lazy);
        return ans;
    }
    
    int binarySearch(int x)
    {
        int l=1,r=size,mid;
        while(l<=r)
        {
            mid=(l+r)/2;
            if(c[mid]==x) return mid;
            else if(c[mid]>x) r=mid-1;
            else l=mid+1;
        }
        return mid;
    }
    int main()
    {
        scanf("%d",&n);
        for(int i=1; i<=n; i++)
        {
            scanf("%d%d",&a[i],&b[i]);
            lst.push_back(a[i]);
            lst.push_back(b[i]);
        }
        lst.sort();
        lst.unique();
        for(it=lst.begin(); it!=lst.end(); it++)
        {
            size++;
            c[size]=*it;
        }
        buildtree();
        for(int i=1; i<=n; i++)
        {
            change(1,binarySearch(a[i]),binarySearch(b[i]));
        }
        printf("%d
    ",query());
        return 0;
    }
  • 相关阅读:
    C# 利用ffmpeg 对视频转换系类操作 (1) 基本分析
    对象的行为
    类、对象、包
    java中的程序流程控制
    季节
    好的博客网址
    大家好 希望大家多多帮助
    Android 4.4 安卓系统突破限制让所有应用程序可操作外置SD卡
    STL笔记:函数配接器(Function adapters)
    STL中仿函数的简要回顾
  • 原文地址:https://www.cnblogs.com/hrj1/p/11581960.html
Copyright © 2020-2023  润新知