zoukankan      html  css  js  c++  java
  • BZOJ 1637: [Usaco2007 Mar]Balanced Lineup( sort + 前缀和 )

    将 0 变为 -1 , 则只需找区间和为 0 , 即前缀和相同的最长区间 , 记录一下每个前缀和出现的最早和最晚的位置 , 比较一下就 OK 了

    -------------------------------------------------------------------------------------------

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<iostream>
     
    #define rep( i , n ) for( int i = 0 ; i < n ; ++i )
    #define clr( x , c ) memset( x , c , sizeof( x ) )
    #define Rep( i , n ) for( int i = 1 ; i <=n ; ++i )
     
    using namespace std;
     
    const int maxn = 50000 + 5;
     
    int n;
     
    struct data {
    int pos , kind , v;
    bool operator < ( const data &rhs ) const {
    return pos < rhs.pos;
    }
    };
     
    data A[ maxn ];
    int sum[ maxn ];
    int L[ maxn ] , R[ maxn ];
     
    int main() {
    freopen( "test.in" , "r" , stdin );
    cin >> n;
    Rep( i , n ) {
    data &x = A[ i ];
    scanf( "%d%d" , &x.kind , &x.pos );
    if( ! x.kind ) x.kind--;
    }
    sort( A + 1 , A + n + 1 );
    sum[ 0 ] = 0;
    Rep( i , n )
       sum[ i ] = sum[ i - 1 ] + A[ i ].kind;
    clr( L , -1 );
    clr( R , -1 );
    Rep( i , n ) if( L[ sum[ i ] ] == -1 )
       L[ sum[ i ] ] = A[ i + 1 <= n ? i + 1 : i ].pos;
    for( int i = n ; i > 0 ; i-- ) if( R[ sum[ i ] ] == -1 )
       R[ sum[ i ] ] = A[ i ].pos;
    int ans = 0;
    rep( i , maxn ) if( L[ i ] != -1 )
       ans = max( ans , R[ i ] - L[ i ] );
    cout << ans << " ";
    return 0;
    }

    ------------------------------------------------------------------------------------------- 

    1637: [Usaco2007 Mar]Balanced Lineup

    Time Limit: 5 Sec  Memory Limit: 64 MB
    Submit: 423  Solved: 283
    [Submit][Status][Discuss]

    Description

    Farmer John 决定给他的奶牛们照一张合影,他让 N (1 ≤ N ≤ 50,000) 头奶牛站成一条直线,每头牛都有它的坐标(范围: 0..1,000,000,000)和种族(0或1)。 一直以来 Farmer John 总是喜欢做一些非凡的事,当然这次照相也不例外。他只给一部分牛照相,并且这一组牛的阵容必须是“平衡的”。平衡的阵容,指的是在一组牛中,种族0和种族1的牛的数量相等。 请算出最广阔的区间,使这个区间内的牛阵容平衡。区间的大小为区间内最右边的牛的坐标减去最做边的牛的坐标。 输入中,每个种族至少有一头牛,没有两头牛的坐标相同。

    Input

    行 1: 一个整数: N 行 2..N + 1: 每行两个整数,为种族 ID 和 x 坐标。

    Output

    行 1: 一个整数,阵容平衡的最大的区间的大小。

    Sample Input

    7
    0 11
    1 10
    1 25
    1 12
    1 4
    0 13
    1 22

    Sample Output

    11
    输入说明

    有7头牛,像这样在数轴上。


    1 1 0 1 0 1 1
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
    输出说明

    牛 #1 (at 11), #4 (at 12), #6 (at 13), #7 (at 22) 组成一个平衡的最大的区间,大小为 22-11=11 个单位长度。

    <-------- 平衡的 -------->
    1 1 0 1 0 1 1
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

    HINT

    Source

  • 相关阅读:
    如何使用 Python 進行字串格式化
    骨牌摆放问题 POJ 2411(状态压缩DP)
    ACM/OI中C++常用优化(实用/调试/技巧)代码(语法)
    Windows 系统如何完全卸载 VSCode
    Python 在VSCode中使用
    第十一场训练赛
    L1-046 整除光棍 (20分)
    Problem 330A
    POJ 2187 Beauty Contest (凸包 旋转卡壳)
    程序员:写作能收获什么?
  • 原文地址:https://www.cnblogs.com/JSZX11556/p/4567107.html
Copyright © 2011-2022 走看看