Cod sursa(job #1603640)

Utilizator akaprosAna Kapros akapros Data 17 februarie 2016 18:21:22
Problema Peste Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 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];
long long sum[maxT], dp[maxN];
priority_queue < int > s;
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;
    freopen("peste.in", "r", stdin);
    scanf("%d %d %d", &n, &k, &t);
    for (i = 1; i <= n; ++ i)
        scanf("%d %d", &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];
        if (s.empty() || s.size() < k || -s.top() < v[i].p)
        {
            if (!s.empty() && s.size() >= k)
            {
                sum[v[i].t] += 1LL * s.top();
                s.pop();
            }
            s.push(-v[i].p);
            sum[v[i].t] += v[i].p;
        }
        while (v[i].t == v[i + 1].t && i + 1 <= n)
        {
            ++ i;
            if (s.empty() || s.size() < k || -s.top() < v[i].p)
            {
                if (!s.empty() && s.size() >= k)
                {
                    sum[v[i].t] += 1LL * s.top();
                    s.pop();
                }
                s.push(-v[i].p);
                sum[v[i].t] += v[i].p;
            }
        }
        T = max(T, v[i].t);
    }
}
void go_fish()
{
    int i, j;
    for (i = 1; i <= t; ++ i)
        for (j = 0, T = Min((i + 1)/ 2, j); j <= T; ++ j)
            dp[i] = Max(dp[i], Max(dp[i - j] + sum[j], dp[j] + sum[i - 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;
}