This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
//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 = 0; i <= n; ++ i)
for(int j = 0; j <= m; ++ j)
{
answer = max(answer, C[i][j]);
answer = max(answer, D[i][j]);
}
printf("%d\n", answer);
}
Compilation message (stderr)
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);
~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |