(UPD: 2024-12-04 14:48 UTC) Judge is not working due to Cloudflare incident. (URL) We can do nothing about it, sorry. After the incident is resolved, we will grade all submissions.

Submission #1123731

#TimeUsernameProblemLanguageResultExecution timeMemory
1123731PacybwoahMeetings (IOI18_meetings)C++20
41 / 100
2128 ms14848 KiB
#include "meetings.h" #include<iostream> #include<algorithm> #include<vector> #include<cassert> #include<utility> using namespace std; typedef long long ll; namespace{ int n, q; vector<ll> vec; } struct node{ ll maxi, tag; node(ll a, ll b){ maxi = a, tag = b; } }; struct st{ vector<node> seg; st(int N){ seg.resize(4 * N + 4, node(0, 0)); } void push(int l, int r, int ind){ if(l == r) return; seg[ind * 2].maxi += seg[ind].tag; seg[ind * 2 + 1].maxi += seg[ind].tag; seg[ind * 2].tag += seg[ind].tag; seg[ind * 2 + 1].tag += seg[ind].tag; seg[ind].tag = 0; } void modify(int l, int r, int start, int end, ll val, int ind){ if(r < start || end < l) return; if(start <= l && r <= end){ seg[ind].maxi += val; seg[ind].tag += val; return; } int mid = (l + r) >> 1; push(l, r, ind); modify(l, mid, start, end, val, ind * 2); modify(mid + 1, r, start, end, val, ind * 2 + 1); seg[ind].maxi = max(seg[ind * 2].maxi, seg[ind * 2 + 1].maxi); } ll query(int l, int r, int start, int end, int ind){ if(r < start || end < l) return 0; if(start <= l && r <= end) return seg[ind].maxi; push(l, r, ind); int mid = (l + r) >> 1; return max(query(l, mid, start, end, ind * 2), query(mid + 1, r, start, end, ind * 2 + 1)); } }; std::vector<long long> minimum_costs(std::vector<int> H, std::vector<int> L, std::vector<int> R) { n = H.size(); q = L.size(); vec.resize(n + 1); for(int i = 1; i <= n; i++) vec[i] = H[i - 1], assert(vec[i] <= 20); vector<ll> ans(q); st seg(n); vector<vector<pair<int, int>>> rngs(21); for(int i = 1; i < 20; i++){ int curl = -1; bool flag = 0; for(int j = 1; j <= n; j++){ if(vec[j] <= i){ if(curl == -1) curl = j; flag = 1; } else{ if(flag){ rngs[i].emplace_back(curl, j - 1); } flag = 0; curl = -1; } } if(curl > 0) rngs[i].emplace_back(curl, n); } for(int i = 1; i < 20; i++){ for(auto &[l, r]: rngs[i]){ seg.modify(1, n, l, r, r - l + 1, 1); } } for(int hey = 0; hey < q; hey++){ int l = L[hey] + 1, r = R[hey] + 1; for(int i = 1; i < 20; i++){ auto iter = lower_bound(rngs[i].begin(), rngs[i].end(), make_pair(l, 0)); if(iter != rngs[i].begin()){ auto &[curl, curr] = (*prev(iter)); if(l <= curr){ seg.modify(1, n, l, curr, -l + curl, 1); } } iter = upper_bound(rngs[i].begin(), rngs[i].end(), make_pair(r, n + 1)); if(iter != rngs[i].begin()){ auto &[curl, curr] = (*prev(iter)); if(curr > r){ seg.modify(1, n, curl, r, -curr + r, 1); } } } ans[hey] = 20ll * (r - l + 1) - seg.query(1, n, l, r, 1); for(int i = 1; i < 20; i++){ auto iter = lower_bound(rngs[i].begin(), rngs[i].end(), make_pair(l, 0)); if(iter != rngs[i].begin()){ auto &[curl, curr] = (*prev(iter)); if(l <= curr){ seg.modify(1, n, l, curr, l - curl, 1); } } iter = upper_bound(rngs[i].begin(), rngs[i].end(), make_pair(r, n + 1)); if(iter != rngs[i].begin()){ auto &[curl, curr] = (*prev(iter)); if(curr > r){ seg.modify(1, n, curl, r, curr - r, 1); } } } } return ans; } // g++ -std=c++17 -Wall -Wextra -Wshadow -fsanitize=undefined -fsanitize=address -o run grader.cpp meetings.cpp
#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...