Submission #1085886

#TimeUsernameProblemLanguageResultExecution timeMemory
1085886kkzyrPyramid Base (IOI08_pyramid_base)C++17
70 / 100
5066 ms65044 KiB
#include <iostream> #include <algorithm> using namespace std; const int MAX_N = 1e6 + 1; const int MAX_OBSTACLES = 4e5 + 1; int n, m, b; int num_obstacles; pair<int, int> obstacle_x[MAX_OBSTACLES]; pair<int, int> obstacle_y[MAX_OBSTACLES]; int cost[MAX_OBSTACLES]; struct event{ int x, type, y_start, y_end; }; bool comp(event x, event y){ return x.x < y.x; } event events[2 * MAX_OBSTACLES]; struct node{ int left_bound, right_bound; int min; int lazy; }; node merge(node left, node right){ return {left.left_bound, right.right_bound, min(left.min + left.lazy, right.min + right.lazy), 0}; } int size_of_tree; node tree[4 * MAX_N]; void update(int left, int right, int tree_node, int delta){ int node_left = tree[tree_node].left_bound; int node_right = tree[tree_node].right_bound; if (node_right < left or node_left > right){ return; } if (node_left >= left and node_right <= right){ tree[tree_node].lazy += delta; return; } tree[2 * tree_node].lazy += tree[tree_node].lazy; tree[2 * tree_node + 1].lazy += tree[tree_node].lazy; update(left, right, 2 * tree_node, delta); update(left, right, 2 * tree_node + 1, delta); tree[tree_node] = merge(tree[2 * tree_node], tree[2 * tree_node + 1]); } int ans; void find_min_cost(int left, int right, int tree_node){ int node_left = tree[tree_node].left_bound; int node_right = tree[tree_node].right_bound; if (node_right < left or node_left > right){ return; } if (node_left >= left and node_right <= right){ ans = min(ans, tree[tree_node].min + tree[tree_node].lazy); return; } tree[2 * tree_node].lazy += tree[tree_node].lazy; tree[2 * tree_node + 1].lazy += tree[tree_node].lazy; find_min_cost(left, right, 2 * tree_node); find_min_cost(left, right, 2 * tree_node + 1); tree[tree_node] = merge(tree[2 * tree_node], tree[2 * tree_node + 1]); } int main(){ cin >> m >> n >> b >> num_obstacles; for (int i = 1;i <= num_obstacles;i++){ cin >> obstacle_x[i].first >> obstacle_y[i].first >> obstacle_x[i].second >> obstacle_y[i].second >> cost[i]; events[2 * i - 1] = {obstacle_x[i].first, cost[i], obstacle_y[i].first, obstacle_y[i].second}; events[2 * i] = {obstacle_x[i].second + 1, -cost[i], obstacle_y[i].first, obstacle_y[i].second}; } sort(events + 1, events + 2 * num_obstacles + 1, comp); int lo = 0; int hi = n; int answer = -1; while (lo <= hi){ int mid = (lo + hi)/2; size_of_tree = 1; while (size_of_tree < (n - mid + 1)){ size_of_tree *= 2; } for (int i = 1;i <= size_of_tree;i++){ tree[size_of_tree + i - 1] = {i, i, 0, 0}; } for (int i = size_of_tree - 1;i >= 1;i--){ tree[i] = merge(tree[2 * i], tree[2 * i + 1]); } int min_overall = 2e9 + 5; int ctr = 1; int ctr_2 = 1; while (ctr <= 2 * num_obstacles and events[ctr].x < mid){ if (events[ctr].type > 0){ update(max(1, events[ctr].y_start - mid + 1), min(n - mid + 1, events[ctr].y_end), 1, events[ctr].type); } ctr++; } for (int i = 1;i <= m - mid + 1;i++){ while (ctr_2 <= 2 * num_obstacles and events[ctr_2].x == i){ if (events[ctr_2].type < 0){ update(max(1, events[ctr_2].y_start - mid + 1), min(n - mid + 1, events[ctr_2].y_end), 1, events[ctr_2].type); } ctr_2++; } while (ctr <= 2 * num_obstacles and events[ctr].x == (i + mid - 1)){ if (events[ctr].type > 0){ update(max(1, events[ctr].y_start - mid + 1), min(n - mid + 1, events[ctr].y_end), 1, events[ctr].type); } ctr++; } ans = 2e9 + 5; find_min_cost(1, n - mid + 1, 1); min_overall = min(min_overall, ans); } if (min_overall <= b){ answer = mid; lo = mid + 1; } else{ hi = mid - 1; } } cout << answer << '\n'; return 0; }
#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...
#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...