//Giorgi Kldiashvili
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 3020;
struct node
{
int l, r, h, c;
};
bool operator < (node a, node b)
{
if(a.r == b.r)
return a.l < b.l;
return a.r < b.r;
}
int tot, H, n, m;
bool check(node a, node b)
{
if(a.r <= b.l || b.r <= a.l)
return false;
if(a.h + b.h > H)
return true;
return false;
}
vector < node > a, b;
int A[N], B[N];
int C[N][N], D[N][N];
int answer;
int main()
{
scanf("%d %d", &tot, &H);
a.push_back({0, 0, 0, 0});
b.push_back({0, 0, 0, 0});
while(tot --)
{
int id, l, r, h, cost;
scanf("%d %d %d %d %d", &id, &l, &r, &h, &cost);
if(id == 0)
a.push_back({l, r, h, cost});
else
b.push_back({l, r, h, cost});
}
sort(a.begin(), a.end());
sort(b.begin(), b.end());
n = a.size() - 1; m = b.size() - 1;
for(int i = 1; i <= n; ++ i)
{
int l = 0; int r = i - 1;
while(l < r)
{
int mid = l + r + 1 >> 1;
if(a[mid].r <= a[i].l)
l = mid;
else
r = mid - 1;
}
A[i] = l;
}
for(int i = 1; i <= m; ++ i)
{
int l = 0; int r = i - 1;
while(l < r)
{
int mid = l + r + 1 >> 1;
if(b[mid].r <= b[i].l)
l = mid;
else
r = mid - 1;
}
B[i] = l;
}
for(int i = 1; i <= m; ++ i)
{
D[0][i] = C[0][B[i]] + b[i].c;
C[0][i] = max(C[0][i - 1], D[0][i]);
}
for(int i = 1; i <= n; ++ i)
{
C[i][0] = D[A[i]][0] + a[i].c;
D[i][0] = max(D[i - 1][0], C[i][0]);
for(int j = 1; j <= m; ++ j)
{
C[i][j] = C[i][j - 1];
D[i][j] = D[i - 1][j];
if(check(a[i], b[j]))
continue;
int now = 0;
if(a[i].l < b[j].l)
now = C[i][B[j]] + b[j].c;
else
now = D[A[i]][j] + a[i].c;
C[i][j] = max(C[i][j], now);
D[i][j] = max(D[i][j], now);
}
}
for(int i = 1; i <= n; ++ i)
for(int j = 1; j <= m; ++ j)
{
answer = max(answer, C[i][j]);
answer = max(answer, D[i][j]);
}
printf("%d\n", answer);
}
Compilation message
mat.cpp: In function 'int main()':
mat.cpp:60:23: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
int mid = l + r + 1 >> 1;
~~~~~~^~~
mat.cpp:73:23: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
int mid = l + r + 1 >> 1;
~~~~~~^~~
mat.cpp:40:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d %d", &tot, &H);
~~~~~^~~~~~~~~~~~~~~~~~~
mat.cpp:46:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d %d %d %d %d", &id, &l, &r, &h, &cost);
~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
3 ms |
376 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
496 KB |
Output is correct |
2 |
Correct |
3 ms |
552 KB |
Output is correct |
3 |
Correct |
4 ms |
632 KB |
Output is correct |
4 |
Correct |
2 ms |
632 KB |
Output is correct |
5 |
Correct |
4 ms |
632 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
4 ms |
1488 KB |
Output is correct |
2 |
Correct |
4 ms |
1500 KB |
Output is correct |
3 |
Correct |
4 ms |
1532 KB |
Output is correct |
4 |
Correct |
5 ms |
1540 KB |
Output is correct |
5 |
Correct |
3 ms |
1540 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
26 ms |
24968 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
45 ms |
30168 KB |
Output is correct |
2 |
Correct |
53 ms |
30608 KB |
Output is correct |
3 |
Correct |
56 ms |
30716 KB |
Output is correct |
4 |
Correct |
70 ms |
30816 KB |
Output is correct |
5 |
Correct |
55 ms |
30916 KB |
Output is correct |
6 |
Correct |
46 ms |
30916 KB |
Output is correct |
7 |
Correct |
47 ms |
30916 KB |
Output is correct |
8 |
Correct |
45 ms |
31204 KB |
Output is correct |
9 |
Correct |
36 ms |
31236 KB |
Output is correct |
10 |
Correct |
40 ms |
31304 KB |
Output is correct |