답안 #71295

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
71295 2018-08-24T10:08:02 Z octopuses 매트 (KOI15_mat) C++17
19 / 100
39 ms 15468 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)
{
  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 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);
        if(a[i].l == b[j].l)
          dp[i][j] = max(dp[i][j], dp[i][B[j]] + b[j].c);
      }
      answer = max(answer, dp[i][j]);
    }
    answer = max(answer, dp[i][0]);
  }
  printf("%d\n", answer);
}
/*
5 10
0 1 4 2 20
0 4 5 9 40
1 0 2 2 10
1 1 3 2 12
1 2 6 2 10
*/

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 Correct 3 ms 376 KB Output is correct
2 Correct 3 ms 488 KB Output is correct
3 Correct 3 ms 544 KB Output is correct
4 Correct 3 ms 544 KB Output is correct
5 Correct 3 ms 544 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 544 KB Output is correct
2 Correct 3 ms 648 KB Output is correct
3 Correct 2 ms 648 KB Output is correct
4 Incorrect 2 ms 648 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 3 ms 912 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 13 ms 12860 KB Output is correct
2 Correct 13 ms 12860 KB Output is correct
3 Correct 13 ms 12860 KB Output is correct
4 Correct 13 ms 12860 KB Output is correct
5 Correct 12 ms 12860 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 27 ms 15340 KB Output is correct
2 Incorrect 39 ms 15468 KB Output isn't correct
3 Halted 0 ms 0 KB -