UVa 1316 - Supermarket

来源:互联网 发布:淘宝上面买东西没发票 编辑:程序博客网 时间:2024/06/05 00:13

贪心

中间查询最值用了线段树

#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#define lson l, m, rt << 1#define rson m + 1, r, rt << 1 | 1using namespace std;const int MAXN = 10010;struct node{    int p, d;};int n;node D[MAXN];int maxi[ MAXN << 2 ];int cmp( const void *a, const void *b ){    node *c = (node *)a;    node *d = (node *)b;    if ( c->p != d->p ) return d->p - c->p;    return d->d - c->d;}void PushUp( int rt ){    maxi[rt] = max( maxi[ rt << 1 ], maxi[ rt << 1 | 1 ]  );    return;}void build( int l, int r, int rt ){    maxi[rt] = r;    if ( l == r ) return;    int m = ( l + r ) >> 1;    build( lson );    build( rson );    return;}int Query( int L, int R, int l, int r, int rt ){    if ( L <= l && r <= R )    {        return maxi[rt];    }    int m = ( l + r ) >> 1;    int maxx = -1;    if ( L <= m ) maxx = max( maxx, Query( L, R, lson ) );    if ( R > m ) maxx = max( maxx, Query( L, R, rson ) );    return maxx;}void Update( int L, int l, int r, int rt ){    if ( L == l && r == L )    {        maxi[rt] = -1;        return;    }    int m = ( l + r ) >> 1;    if ( L <= m ) Update( L, lson );    else Update( L, rson );    PushUp(rt);    return;}int main(){    while ( scanf( "%d", &n ) == 1 )    {        int maxT = 1;        for ( int i = 0; i < n; ++i )        {            scanf( "%d%d", &D[i].p, &D[i].d );            maxT = max( maxT, D[i].d );        }        qsort( D, n, sizeof(D[0]), cmp );        build( 1, maxT, 1 );        int ans = 0;        for ( int i = 0; i < n; ++i )        {            int tp = Query( 1, D[i].d, 1, maxT, 1 );            if ( tp != -1 )            {                ans += D[i].p;                Update( tp, 1, maxT, 1 );            }        }        printf( "%d\n", ans );    }    return 0;}



原创粉丝点击