제출 #542739

#제출 시각아이디문제언어결과실행 시간메모리
542739OlympiaNekameleoni (COCI15_nekameleoni)C++17
0 / 140
3075 ms130696 KiB
#include <vector> #include <algorithm> #include <iostream> #include <set> #include <cmath> #include <map> #include <random> #include <cassert> #include <ctime> #include <cstdlib> #include <limits.h> using namespace std; class Node { public: vector<int> left, right; bool okay = true; Node () { left.assign(51, INT_MAX), right.assign(51, -1); } }; vector<int64_t> powr; Node generate (int t, int64_t x) { Node ans; ans.left[x] = t; ans.left[0] = 0; ans.right[x] = t; ans.right[0] = 0; return ans; } int finder (vector<int> v1, vector<int> v2, int K) { set<int> s; for (int i = 1; i <= K; i++) { if (v1[i] == -1 || v1[i] == INT_MAX) return -1; s.insert(v1[i]); } for (int i = 1; i <= K; i++) { if (v2[i] == -1 || v2[i] == INT_MAX) return -1; s.insert(v2[i]); } int ans = INT_MAX; for (int i: s) { for (int j: s) { bool fine = true; for (int k = 1; k <= K; k++) { if ((v1[k] < i || v1[k] > j) && (v2[k] < i || v2[k] > j)) { fine = false; break; } } if (fine) { ans = min(ans, abs(j-i)); } } } return ans + 1; } Node merge (Node x, Node y) { if (!x.okay) return y; if (!y.okay) return x; Node ans; ans.left = x.left; ans.right = y.right; for (int i = 0; i <= 50; i++) { ans.left[i] = min(x.left[i], y.left[i]); } for (int i = 0; i <= 50; i++) { ans.right[i] = max(x.right[i], y.right[i]); } return ans; } template<class T> class SegmentTree { public: SegmentTree (int N) { N = (1 << ((int)floor(log2(N - 1)) + 1)); this->N = N; val.assign(2 * N, ID); ID.okay = false; } void update (int x, T y) { x += N - 1; val[x] = y; while (x != 0) { x = (x - 1)/2; val[x] = merge(val[2 * x + 1], val[2 * x + 2]); } } void build (int dum, vector<int>& arr, int tl, int tr) { if (tl == tr) { if (tl < arr.size()) val[dum] = generate(tl, arr[tl]); else val[dum] = generate(tl, 0); return; } build(2 * dum + 1, arr, tl, (tl + tr)/2); build(2 * dum + 2, arr, (tl + tr)/2 + 1, tr); val[dum] = merge(val[2 * dum + 1], val[2 * dum + 2]); } void build (vector<int> arr) { build(0, arr, 0, N - 1); } T query (int ind, const int l, const int r, int tl, int tr) { if (tl >= l && tr <= r) { return val[ind]; } if (tr < l || tl > r) { return ID; } return merge(query(2 * ind + 1, l, r, tl, (tl + tr)/2), query(2 * ind + 2, l, r, (tl + tr)/2 + 1, tr)); } T query (int l, int r) { return query(0, l, r, 0, N - 1); } private: vector<T> val; T ID; int N; }; int main() { //freopen("balancing.in", "r", stdin); ios_base::sync_with_stdio(false); cin.tie(NULL); int N, K, M; cin >> N >> K >> M; SegmentTree<Node> st(N); vector<int> arr(N); for (int i = 0; i < N; i++) { cin >> arr[i]; } powr = {1}; for (int i = 0; i < 50; i++) { powr.push_back(powr.back() * 2); } st.build(arr); while (M--) { int t; cin >> t; if (t == 2) { Node myNode = st.query(0, N - 1); cout << finder(myNode.left, myNode.right, K) << '\n'; } else { int p, v; cin >> p >> v; p--; st.update(p, generate(p, v)); } } }

컴파일 시 표준 에러 (stderr) 메시지

nekameleoni.cpp: In instantiation of 'void SegmentTree<T>::build(int, std::vector<int>&, int, int) [with T = Node]':
nekameleoni.cpp:104:14:   required from 'void SegmentTree<T>::build(std::vector<int>) [with T = Node]'
nekameleoni.cpp:140:17:   required from here
nekameleoni.cpp:94:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   94 |             if (tl < arr.size()) val[dum] = generate(tl, arr[tl]);
      |                 ~~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...