随机化算法

无比膜拜这个犀利的随机化算法

#include <algorithm>
#include <cstdio>
#include <cstdlib>

#define MAX 300000
#define ITER 100

using namespace std;

typedef pair<int,int> par;

inline int myrand() {
    int a = rand()%5000;
    int b = rand()%5000;
    return a*5000+b;
}

int n, Q, C;
int a[MAX];
par b[MAX];

int main( void ) {
    while( scanf( "%d%d", &n, &C ) != EOF )
    {
    for( int i = 0; i < n; ++i ) scanf( "%d", &a[i] );
    for( int i = 0; i < n; ++i ) b[i] = par( a[i], i );
    sort( b, b+n );

    scanf( "%d", &Q );
    for( int qq = 0; qq < Q; ++qq ) {
        int lo, hi;
        scanf( "%d%d", &lo, &hi ); --lo; --hi;

        int m = hi-lo+1;
        int iter, x, cnt;
        for( iter = 0; iter < ITER; ++iter ) {
            x = a[lo+myrand()%m];
            cnt = upper_bound(b, b+n, par(x, hi)) - lower_bound(b, b+n, par(x, lo));

            if( cnt*2 > m ) break;
        }
        if( iter == ITER ) printf( "no\n" );
        else printf( "yes %d\n", x );
       }
    }
    return 0;
}

posted on 2012-10-05 21:00  more think, more gains  阅读(174)  评论(0编辑  收藏  举报

导航