Cod sursa(job #1603916)

Utilizator akaprosAna Kapros akapros Data 17 februarie 2016 20:31:01
Problema Peste Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.19 kb
#include <bits/stdc++.h>
#define maxN 50002
#define maxT 1002
#define ll long long
using namespace std;
int n, m, k, t, T;
struct fish
{
    int p, t;
} v[maxN];
ll dp[maxN];
int sum[maxT];
priority_queue < int > s;
class InputReader
{
public:
    InputReader() {}
    InputReader(const char *file_name)
    {
        input_file = fopen(file_name, "r");
        cursor = 0;
        fread(buffer, SIZE, 1, input_file);
    }
    inline InputReader &operator >>(int &n)
    {
        while(buffer[cursor] < '0' || buffer[cursor] > '9')
        {
            advance();
        }
        n = 0;
        while('0' <= buffer[cursor] && buffer[cursor] <= '9')
        {
            n = n * 10 + buffer[cursor] - '0';
            advance();
        }
        return *this;
    }
private:
    FILE *input_file;
    static const int SIZE = 1 << 16;
    int cursor;
    char buffer[SIZE];
    inline void advance()
    {
        ++ cursor;
        if(cursor == SIZE)
        {
            cursor = 0;
            fread(buffer, SIZE, 1, input_file);
        }
    }
};
ll Max(ll a, ll b)
{
    if (a > b)
        return a;
    return b;
}
int Min(int a, int b)
{
    if (a < b)
        return a;
    return b;
}
int cmp(const fish a, const fish b)
{
    if (a.t == b.t)
        return a.p < b.p;
    return a.t < b.t;
}
void read()
{
    int i;
    InputReader cin("peste.in");
    cin >> n >> k >> t;
    for (i = 1; i <= n; ++ i)
        cin >> v[i].p >> v[i].t;
}
void get_fish()
{
    int i, j;
    sort(v + 1, v + n + 1, cmp);
    for (i = 1; i <= n; ++ i)
    {
        sum[v[i].t] = sum[v[i - 1].t] + v[i].p;
        s.push(-v[i].p);
        if (i > k)
        {
            sum[v[i].t] += s.top();
            s.pop();
        }
    }
    T = v[n].t;
}
void go_fish()
{
    int i, j;
    for (i = 1; i <= t; ++ i)
        for (j = 1; j <= min(i, T); ++ j)
            dp[i] = max(dp[i], 1LL * (dp[i - j] + 1LL * sum[j]));
}
void solve()
{
    get_fish();
    go_fish();
}
void write()
{
    freopen("peste.out", "w", stdout);
    printf("%lld\n", dp[t]);
}
int main()
{
    read();
    solve();
    write();
    return 0;
}