제출 #519323

#제출 시각아이디문제언어결과실행 시간메모리
519323Be_dosHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++17
30 / 100
1814 ms139136 KiB
#include <iostream> #include <cmath> #include <cctype> #include <vector> #include <algorithm> #include <set> #include <map> #include <deque> #include <stack> #include <unordered_set> #include <sstream> #include <cstring> #include <iomanip> #include <queue> #include <unordered_map> #include <random> #include <cfloat> #include <chrono> #include <bitset> #include <complex> #include <immintrin.h> #include <cassert> struct Query { int32_t left, x; int32_t ind; Query(int32_t left_, int32_t x_, int32_t ind_) { left = left_; x = x_; ind = ind_; } }; #define M_INF (-1'000'000'005) struct Node { int32_t max_added = M_INF; int32_t max1 = M_INF; int32_t ans = M_INF; }; struct Segtree { int32_t* arr; int32_t size_; Node* segtree; void build(int32_t node, int32_t left, int32_t right) { if(right - left == 1) { segtree[node].max1 = arr[left]; return; } int32_t m = (left + right) / 2; build(node * 2 + 1, left, m); build(node * 2 + 2, m, right); segtree[node].max1 = std::max(segtree[node * 2 + 1].max1, segtree[node * 2 + 2].max1); segtree[node].ans = std::max(segtree[node].max_added + segtree[node].max1, std::max(segtree[node * 2 + 1].ans, segtree[node * 2 + 2].ans)); } Segtree(int32_t n, int32_t* arr_) { arr = arr_; segtree = new Node[4 * n]; build(0, 0, n); size_ = n; } void propagate(int32_t node, int32_t left, int32_t m, int32_t right) { segtree[node * 2 + 1].max_added = std::max(segtree[node * 2 + 1].max_added, segtree[node].max_added); segtree[node * 2 + 1].ans = std::max(segtree[node * 2 + 1].ans, segtree[node * 2 + 1].max_added + segtree[node * 2 + 1].max1); segtree[node * 2 + 2].max_added = std::max(segtree[node * 2 + 2].max_added, segtree[node].max_added); segtree[node * 2 + 2].ans = std::max(segtree[node * 2 + 2].ans, segtree[node * 2 + 2].max_added + segtree[node * 2 + 2].max1); } void max_eq(int32_t node, int32_t left, int32_t right, int32_t query_left, int32_t query_right, int32_t x) { if(left >= query_right || right <= query_left) return; if(left >= query_left && right <= query_right) { segtree[node].max_added = std::max(segtree[node].max_added, x); if(right - left == 1) segtree[node].ans = segtree[node].max_added + segtree[node].max1; else segtree[node].ans = std::max(segtree[node].max_added + segtree[node].max1, std::max(segtree[node * 2 + 1].ans, segtree[node * 2 + 2].ans)); return; } int32_t m = (left + right) / 2; propagate(node, left, m, right); max_eq(node * 2 + 1, left, m, query_left, query_right, x); max_eq(node * 2 + 2, m, right, query_left, query_right, x); segtree[node].ans = std::max(segtree[node].max_added + segtree[node].max1, std::max(segtree[node * 2 + 1].ans, segtree[node * 2 + 2].ans)); } void max_eq(int32_t left, int32_t right, int32_t x) { max_eq(0, 0, size_, left, right, x); } int32_t get(int32_t node, int32_t left, int32_t right, int32_t query_left, int32_t query_right) { if(left >= query_right || right <= query_left) return M_INF; if(left >= query_left && right <= query_right) return segtree[node].ans; int32_t m = (left + right) / 2; propagate(node, left, m, right); return std::max(get(node * 2 + 1, left, m, query_left, query_right), get(node * 2 + 2, m, right, query_left, query_right)); } int32_t get(int32_t left, int32_t right) { return get(0, 0, size_, left, right); } }; int main() { std::ios::sync_with_stdio(false); std::cin.tie(0); int32_t n, num_q; std::cin >> n >> num_q; int32_t* arr = new int32_t[n]; for(int32_t i = 0; i < n; i++) std::cin >> arr[i]; std::vector<Query>* queries = new std::vector<Query>[n]; int32_t* bounds = new int32_t[num_q]; for(int32_t q = 0; q < num_q; q++) { int32_t left, right, x; std::cin >> left >> right >> x; left--; right--; bounds[q] = x; queries[right].emplace_back(left, x, q); } Segtree tree(n, arr); std::stack<int32_t> maximums; int32_t* ans = new int32_t[n]; for(int32_t i = 0; i < n; i++) { while(!maximums.empty() && arr[maximums.top()] <= arr[i]) maximums.pop(); if(!maximums.empty()) tree.max_eq(0, maximums.top() + 1, arr[i]); maximums.push(i); for(int32_t q = 0; q < queries[i].size(); q++) ans[queries[i][q].ind] = tree.get(queries[i][q].left, i + 1); } for(int32_t q = 0; q < num_q; q++) std::cout << (ans[q] > bounds[q] ? 0 : 1) << "\n"; return 0; }

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

sortbooks.cpp: In function 'int main()':
sortbooks.cpp:147:30: warning: comparison of integer expressions of different signedness: 'int32_t' {aka 'int'} and 'std::vector<Query>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  147 |         for(int32_t q = 0; q < queries[i].size(); q++)
      |                            ~~^~~~~~~~~~~~~~~~~~~
#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...