Pagini recente » Cod sursa (job #3338230) | Cod sursa (job #2295556) | Cod sursa (job #2470760) | Cod sursa (job #3332708) | Cod sursa (job #1603670)
#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;
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 << 17;
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] + 1LL * v[i].p;
s.push(-v[i].p);
if (i > k)
{
sum[v[i].t] += 1LL * s.top();
s.pop();
}
}
T = v[n].t;
}
void go_fish()
{
int i, j;
for (i = 1; i <= t; ++ i)
for (j = 0; j <= Min(i, T); ++ j)
{
dp[i] = Max(dp[i], Max(1LL * (dp[i - j] + sum[j]), 1LL * (dp[j] + sum[i - j])));
if (i - j <= j)
break;
}
}
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;
}