답안 #930529

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
930529 2024-02-20T05:47:41 Z Der_Vlapos 벽 (IOI14_wall) C++17
32 / 100
3000 ms 186956 KB
#include "wall.h"
#include <bits/stdc++.h>

using namespace std;

#define f first
#define s second
#define pii pair<int, int>
#define ll long long

const int BIG = 2e9 + 500;

struct segTree
{
  struct Node
  {
    deque<pii> ops;
  };
  vector<Node> tree;
  int sz;

  void init(int n)
  {
    sz = 1;
    while (sz < n)
      sz *= 2;
    tree.resize(2 * sz);
  }

  // 0 - min=
  // 1 - max=

  void upd(int v, int lv, int rv, pii op)
  {
    // cout << lv << " " << rv << " " << op.f << " " << op.s << "!!!\n";
    if (tree[v].ops.size() and op.f == tree[v].ops.back().f)
      tree[v].ops.back().s = (op.f == 0 ? min(op.s, tree[v].ops.back().s) : max(op.s, tree[v].ops.back().s));
    else if (tree[v].ops.size() < 2)
      tree[v].ops.push_back(op);
    else
    {
      if (op.f == 1)
      {
        int C1 = tree[v].ops.begin()->s;
        tree[v].ops.pop_front();
        int C2 = tree[v].ops.begin()->s;
        int C3 = op.s;
        tree[v].ops.push_back({1, max(min(C1, C2), C3)});
      }
      else
      {
        int C1 = tree[v].ops.begin()->s;
        tree[v].ops.pop_front();
        int C2 = tree[v].ops.begin()->s;
        int C3 = op.s;
        tree[v].ops.push_back({0, min(max(C1, C2), C3)});
      }
    }
  }

  void push(int v, int lv, int rv)
  {
    if (rv - lv == 1)
      return;
    int m = (lv + rv) >> 1;
    while (tree[v].ops.size())
    {
      pii op = tree[v].ops.front();
      tree[v].ops.pop_front();
      upd(v * 2 + 1, lv, m, op);
      upd(v * 2 + 2, m, rv, op);
    }
  }

  void addOp(int l, int r, pii op, int v, int lv, int rv)
  {
    push(v, lv, rv);
    if (l <= lv and rv <= r)
    {
      upd(v, lv, rv, op);
      return;
    }
    if (rv <= l or r <= lv)
      return;
    int m = (lv + rv) >> 1;
    addOp(l, r, op, v * 2 + 1, lv, m);
    addOp(l, r, op, v * 2 + 2, m, rv);
  }

  void addOp(int l, int r, pii op)
  {
    addOp(l, r, op, 0, 0, sz);
  }

  void outArray(vector<int> &a, int v, int lv, int rv)
  {
    push(v, lv, rv);
    if (rv - lv == 1)
    {
      if (lv < a.size())
      {
        while (tree[v].ops.size())
        {
          pii op = tree[v].ops.front();
          tree[v].ops.pop_front();
          a[lv] = op.f ? max(a[lv], op.s) : min(a[lv], op.s);
        }
      }
      return;
    }
    int m = (lv + rv) >> 1;
    outArray(a, v * 2 + 1, lv, m);
    outArray(a, v * 2 + 2, m, rv);
  }

  void outArray(vector<int> &a)
  {
    outArray(a, 0, 0, sz);
  }
};

void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[])
{
  vector<int> a;
  for (int i = 0; i < n; ++i)
    a.push_back(finalHeight[i]);

  segTree tree;
  tree.init(n);

  for (int i = 0; i < k; ++i)
  {
    op[i]--;
    tree.addOp(left[i], right[i] + 1, {1 - op[i], height[i]});
  }

  tree.outArray(a);

  for (int i = 0; i < n; ++i)
    finalHeight[i] = a[i];

  return;
}

Compilation message

wall.cpp: In member function 'void segTree::outArray(std::vector<int>&, int, int, int)':
wall.cpp:100:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  100 |       if (lv < a.size())
      |           ~~~^~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 3 ms 1116 KB Output is correct
4 Correct 25 ms 22616 KB Output is correct
5 Correct 17 ms 22620 KB Output is correct
6 Correct 17 ms 22616 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 101 ms 8240 KB Output is correct
3 Correct 377 ms 48208 KB Output is correct
4 Correct 2170 ms 186240 KB Output is correct
5 Correct 357 ms 185328 KB Output is correct
6 Correct 346 ms 185436 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 2 ms 604 KB Output is correct
3 Correct 3 ms 1112 KB Output is correct
4 Correct 27 ms 22620 KB Output is correct
5 Correct 18 ms 22620 KB Output is correct
6 Correct 17 ms 22620 KB Output is correct
7 Correct 1 ms 348 KB Output is correct
8 Correct 101 ms 8132 KB Output is correct
9 Correct 406 ms 48164 KB Output is correct
10 Correct 2149 ms 186324 KB Output is correct
11 Correct 353 ms 185292 KB Output is correct
12 Correct 353 ms 185392 KB Output is correct
13 Correct 0 ms 348 KB Output is correct
14 Correct 105 ms 8020 KB Output is correct
15 Correct 133 ms 45392 KB Output is correct
16 Execution timed out 3048 ms 186864 KB Time limit exceeded
17 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 1 ms 360 KB Output is correct
3 Correct 3 ms 976 KB Output is correct
4 Correct 27 ms 22620 KB Output is correct
5 Correct 17 ms 22620 KB Output is correct
6 Correct 17 ms 22668 KB Output is correct
7 Correct 0 ms 344 KB Output is correct
8 Correct 102 ms 8020 KB Output is correct
9 Correct 388 ms 48192 KB Output is correct
10 Correct 2145 ms 186180 KB Output is correct
11 Correct 359 ms 185288 KB Output is correct
12 Correct 347 ms 185296 KB Output is correct
13 Correct 0 ms 348 KB Output is correct
14 Correct 106 ms 8256 KB Output is correct
15 Correct 118 ms 45140 KB Output is correct
16 Execution timed out 3063 ms 186956 KB Time limit exceeded
17 Halted 0 ms 0 KB -