結果
問題 | No.1675 Strange Minimum Query |
ユーザー | SSRS |
提出日時 | 2021-09-10 21:26:58 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 402 ms / 2,000 ms |
コード長 | 1,441 bytes |
コンパイル時間 | 1,868 ms |
コンパイル使用メモリ | 179,088 KB |
実行使用メモリ | 47,004 KB |
最終ジャッジ日時 | 2024-06-11 22:26:22 |
合計ジャッジ時間 | 12,993 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 34 |
ソースコード
#include <bits/stdc++.h> using namespace std; const int INF = 1000000000; template <typename T> struct sparse_table{ vector<vector<T>> ST; sparse_table(vector<T> &A){ int N = A.size(); int LOG = 32 - __builtin_clz(N); ST = vector<vector<T>>(LOG, vector<T>(N)); for (int i = 0; i < N; i++){ ST[0][i] = A[i]; } for (int i = 0; i < LOG - 1; i++){ for (int j = 0; j < N - (1 << i); j++){ ST[i + 1][j] = min(ST[i][j], ST[i][j + (1 << i)]); } } } T range_min(int L, int R){ int d = 31 - __builtin_clz(R - L); return min(ST[d][L], ST[d][R - (1 << d)]); } }; int main(){ int N, Q; cin >> N >> Q; vector<int> l(Q), r(Q), B(Q); for (int i = 0; i < Q; i++){ cin >> l[i] >> r[i] >> B[i]; l[i]--; } vector<vector<int>> add(N + 1), sub(N + 1); for (int i = 0; i < Q; i++){ add[l[i]].push_back(B[i]); sub[r[i]].push_back(B[i]); } multiset<int> st; st.insert(1); vector<int> A(N); for (int i = 0; i < N; i++){ for (int x : add[i]){ st.insert(x); } for (int x : sub[i]){ st.erase(st.find(x)); } A[i] = *prev(st.end()); } sparse_table<int> ST(A); bool ok = true; for (int i = 0; i < Q; i++){ if (ST.range_min(l[i], r[i]) != B[i]){ ok = false; } } if (!ok){ cout << -1 << endl; } else { for (int i = 0; i < N; i++){ cout << A[i]; if (i < N - 1){ cout << ' '; } } cout << endl; } }