Submission #71307

#TimeUsernameProblemLanguageResultExecution timeMemory
71307octopuses매트 (KOI15_mat)C++17
100 / 100
54 ms30788 KiB
//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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...