Submission #71277

# Submission time Handle Problem Language Result Execution time Memory
71277 2018-08-24T09:53:34 Z octopuses 매트 (KOI15_mat) C++17
19 / 100
38 ms 16248 KB
//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)
{
  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 dp[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)
    dp[0][i] = max(dp[0][i - 1], dp[0][B[i]] + b[i].c), answer = max(answer, dp[0][i]);
  for(int i = 1; i <= n; ++ i)
  {
    dp[i][0] = max(dp[i - 1][0], dp[A[i]][0] + a[i].c);
    for(int j = 1; j <= m; ++ j)
    {
      dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
      if(check(a[i], b[j]))
      {
        answer = max(answer, dp[i][j]);
        continue;
      }
      if(a[i].l < b[j].l)
        dp[i][j] = max(dp[i][j], dp[i][B[j]] + b[j].c);
      else
        dp[i][j] = max(dp[i][j], dp[A[i]][j] + a[i].c);
      answer = max(answer, dp[i][j]);
    }
    answer = max(answer, dp[i][0]);
  }
  printf("%d\n", answer);
}

Compilation message

mat.cpp: In function 'int main()':
mat.cpp:58:23: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
       int mid = l + r + 1 >> 1;
                 ~~~~~~^~~
mat.cpp:71:23: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
       int mid = l + r + 1 >> 1;
                 ~~~~~~^~~
mat.cpp:38: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:44: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
1 Correct 4 ms 376 KB Output is correct
2 Correct 2 ms 376 KB Output is correct
3 Correct 2 ms 440 KB Output is correct
4 Correct 2 ms 484 KB Output is correct
5 Correct 2 ms 560 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 4 ms 640 KB Output is correct
2 Correct 3 ms 640 KB Output is correct
3 Correct 3 ms 648 KB Output is correct
4 Incorrect 2 ms 652 KB Output isn't correct
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 5 ms 1040 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 17 ms 12848 KB Output is correct
2 Correct 14 ms 12904 KB Output is correct
3 Correct 16 ms 13104 KB Output is correct
4 Correct 16 ms 13232 KB Output is correct
5 Correct 16 ms 13232 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 22 ms 15852 KB Output is correct
2 Incorrect 38 ms 16248 KB Output isn't correct
3 Halted 0 ms 0 KB -