hdu4020水题

挺水的,我是用n个set分别存下n个用户的广告,然后对于遍历一次所有用户的广告处理出ans数组,输出即可。

/*
 * hdu4020/win.cpp
 * Created on: 2012-11-10
 * Author    : ben
 */
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <queue>
#include <set>
#include <map>
#include <stack>
#include <string>
#include <vector>
#include <deque>
#include <list>
#include <functional>
#include <numeric>
#include <cctype>
using namespace std;
const int MAXN = 100100;
const int MAXM = 500100;
typedef long long LL;
typedef set<pair<int, int> > MySet;
int N, M, Q;
MySet customer[MAXN];
LL ans[MAXM];
int get_int() {
    int res = 0, ch;
    while (!((ch = getchar()) >= '0' && ch <= '9')) {
        if (ch == EOF)
            return 1 << 30;
    }
    res = ch - '0';
    while ((ch = getchar()) >= '0' && ch <= '9')
        res = res * 10 + (ch - '0');
    return res;
}
int main() {
#ifndef ONLINE_JUDGE
    freopen("data.in", "r", stdin);
#endif
    int T, a, b, c;
    T = get_int();
    for(int t = 1; t <= T; t++) {
        N = get_int();
        M = get_int();
        Q = get_int();
        for(int i = 0; i < M; i++) {
            a = get_int();
            b = get_int();
            c = get_int();
            customer[a - 1].insert(make_pair(b, c));
        }
        memset(ans, 0, sizeof(ans));
        for(int i = 0; i < N; i++) {
            int len = customer[i].size();
            MySet::iterator it = customer[i].end();
            for(int j = 1; j <= len; j++) {
                it--;
                ans[j] += (*it).second;
            }
            customer[i].clear();
        }
        for(int i = 1; i <= M; i++) {
            ans[i] += ans[i - 1];
        }
        printf("Case #%d:\n", t);
        for(int i = 0; i < Q; i++) {
            a = get_int();
            if(a >= M) {
                a = M;
            }
            printf("%I64d\n", ans[a]);
        }
    }
    return 0;
}
posted @ 2012-11-12 16:30  moonbay  阅读(159)  评论(0编辑  收藏  举报