hdu 4864

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <set>
#include <queue>
using namespace std;

#define mxn 100020
#define LL long long
#define N 7020
#define inf 0x3f3f3f3f
#define ls ( i << 1 )
#define rs ( ls | 1 )
#define md ( ( ll[i] + rr[i] ) >> 1 )

struct mach {
    int a, x;
    bool operator < ( const mach &b ) const {
        return x < b.x;
    }
}c[mxn];
struct task {
    int b, y;
    bool operator < ( const task &tmp ) const {
        return y < tmp.y;
    }
}d[mxn];

int n, m;
int cnt[1500];
priority_queue<int> q[1500];
void init() {
    for( int i = 0; i < 1500; ++i )
        while( !q[i].empty() )
            q[i].pop();
}
int ll[N], rr[N], mx[N];
void build( int l, int r, int i ) {
    ll[i] = l, rr[i] = r;
    if( l == r ) {
        mx[i] = -1;
        return;
    }
    build( l, md, ls );
    build( md + 1, r, rs );
    mx[i] = max( mx[ls], mx[rs] );
}
void update( int k, int v, int i ) {
    if( ll[i] == rr[i] ) {
        mx[i] = v;
        return;
    }
    if( k <= md )
        update( k, v, ls );
    else
        update( k, v, rs );
    mx[i] = max( mx[ls], mx[rs] );
}
int query( int l, int r, int i ) {
    if( ll[i] == l && rr[i] == r ) {
        return mx[i];
    }
    if( r <= md )
        return query( l, r, ls );
    if( l > md )
        return query( l, r, rs );
    return max( query( l, md, ls ), query( md + 1, r, rs ) );
}
int main() {
//    freopen( "tt.txt", "r", stdin );
    while( scanf( "%d%d", &n, &m ) != EOF ) {
        for( int i = 1; i <= n; ++i )
            scanf( "%d%d", &c[i].a, &c[i].x );
        for( int i = 1; i <= m; ++i )
            scanf( "%d%d", &d[i].b, &d[i].y );
        sort( c + 1, c + n + 1 );
        sort( d + 1, d + m + 1 );
        int j = 1;
        memset( cnt, 0, sizeof( cnt ) );
        int ans = 0;
        LL money = 0;
        init();
        build( 1, 1500, 1 );
        for( int i = 1; i <= n; ++i ) {
            while( j <= m && d[j].y <= c[i].x ) {
                if( !cnt[d[j].b] )
                    update( d[j].b, d[j].b, 1 );
                cnt[d[j].b] ++;
                q[d[j].b].push( d[j].y );
                j++;
            }
            int tmp = query( 1, c[i].a, 1 );
            if( tmp == -1 )
                continue;
            ans++;
            money += 500 * tmp + 2 * q[tmp].top();
            q[tmp].pop();
            --cnt[tmp];
            if( cnt[tmp] == 0 )
                update( tmp, -1, 1 );
        }
        printf( "%d %I64d\n", ans, money );
    }
    return 0;
}



版权声明:本文为u013654696原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。