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

  • 相关阅读:
    高精度计算
    高精度除以低精度
    P1258 小车问题
    POJ 2352 stars (树状数组入门经典!!!)
    HDU 3635 Dragon Balls(超级经典的带权并查集!!!新手入门)
    HDU 3938 Portal (离线并查集,此题思路很强!!!,得到所谓的距离很巧妙)
    POJ 1703 Find them, Catch them(确定元素归属集合的并查集)
    HDU Virtual Friends(超级经典的带权并查集)
    HDU 3047 Zjnu Stadium(带权并查集,难想到)
    HDU 3038 How Many Answers Are Wrong(带权并查集,真的很难想到是个并查集!!!)
  • 原文地址:https://www.cnblogs.com/JSZX11556/p/4567107.html
Copyright © 2011-2022 走看看