답안 #1046449

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1046449 2024-08-06T14:56:48 Z qrno Meteors (POI11_met) C++17
74 / 100
960 ms 65536 KB
#include <bits/stdc++.h>
using namespace std;

#define int long long

//{{{ FenwickTree
struct FenwickTree {
  int N;
  vector<int> data;

  FenwickTree(int N) : N(N), data(N) {}

  void add(int idx, int delta) {
    for (; idx < N; idx |= idx+1)
      data[idx] += delta;
  }

  int sum(int r) {
    int ret = 0;
    for (; r >= 0; r &= r+1, r--)
      ret += data[r];
    return ret;
  }

  int sum(int l, int r) {
    return sum(r) - sum(l-1);
  }
};
//}}}

// Range Fenwick {{{
struct RangeFenwick {
  FenwickTree FT;
  RangeFenwick(int N) : FT(N+1) {}

  void update(int l, int r, int x) {
    FT.add(l, x);
    FT.add(r+1, -x);
  }

  int query(int idx) {
    return FT.sum(idx);
  }
};
//}}}

const int LOG = 20;

// Debug {{{
#define var(x) "[", #x, " ", x, "] "
template<typename ...A> void db(A const&... a) { ((cout << (a)), ...); cout << endl; }
//}}}

signed main() {
  ios::sync_with_stdio(false); cin.tie(nullptr);

  int N, M;
  cin >> N >> M;

  vector<int> O(M), P(N);
  for (auto &x : O) cin >> x, x--;
  for (auto &x : P) cin >> x;

  vector<vector<int>> S(N);
  for (int i = 0; i < M; i++)
    S[O[i]].push_back(i);

  int K;
  cin >> K;

  vector<array<int, 3>> Q(K);
  for (auto &[l, r, a] : Q) {
    cin >> l >> r >> a;
    l--, r--;
  }

  vector<vector<int>> who(K+1);
  vector<int> L(N, 0), R(N, K-1);
  vector<int> ans(N, -1);

  for (int step = 0; step < LOG; step++) {
    for (int i = 0; i < N; i++) {
      if (L[i] > R[i]) continue;
      int mid = (L[i]+R[i])/2;
      who[mid].push_back(i);
    }

    RangeFenwick FT(M);
    for (int mid = 0; mid < K; mid++) {
      auto [l, r, x] = Q[mid];
      if (l <= r) {
        FT.update(l, r, x);
      } else {
        FT.update(l, M-1, x);
        FT.update(0, r, x);
      }

      for (auto v : who[mid]) {
        int sum = 0;
        for (auto s : S[v]) {
          sum += FT.query(s);
          if (sum >= P[v]) break;
        }
        if (sum >= P[v]) {
          ans[v] = mid;
          R[v] = mid-1;
        } else {
          L[v] = mid+1;
        }
      }
      who[mid].clear();
    }
  }

  for (auto x : ans) {
    if (x == -1) cout << "NIE" << endl;
    else cout << x+1 << endl;
  }
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 1 ms 604 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 1 ms 604 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 52 ms 5436 KB Output is correct
2 Correct 124 ms 10056 KB Output is correct
3 Correct 77 ms 7624 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 80 ms 6756 KB Output is correct
2 Correct 87 ms 6584 KB Output is correct
3 Correct 113 ms 10052 KB Output is correct
4 Correct 28 ms 5072 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 54 ms 5576 KB Output is correct
2 Correct 82 ms 9908 KB Output is correct
3 Correct 26 ms 2904 KB Output is correct
4 Correct 80 ms 8468 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 75 ms 4152 KB Output is correct
2 Correct 87 ms 6724 KB Output is correct
3 Correct 54 ms 4556 KB Output is correct
4 Correct 111 ms 11080 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 960 ms 49288 KB Output is correct
2 Correct 536 ms 21544 KB Output is correct
3 Correct 126 ms 14676 KB Output is correct
4 Runtime error 722 ms 65536 KB Execution killed with signal 9
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 915 ms 47252 KB Output is correct
2 Correct 522 ms 21564 KB Output is correct
3 Correct 106 ms 13664 KB Output is correct
4 Runtime error 631 ms 65536 KB Execution killed with signal 9
5 Halted 0 ms 0 KB -