Submission #826465

#TimeUsernameProblemLanguageResultExecution timeMemory
826465esomerRadio Towers (IOI22_towers)C++17
27 / 100
4080 ms23032 KiB
#include <bits/stdc++.h> #include "towers.h" using namespace std; int N, spec; vector<int> H, lw; vector<vector<pair<int, int>>> mn; pair<int, int> get_mx(int l, int r){ int k = lw[r - l + 1]; return max(mn[k][r], mn[k][l + (1 << k) - 1]); } void init(int n, vector<int> H1) { N = n; H = H1; spec = 0; bool asc = 1; for(int i = 1; i < N; i++){ if(spec == -1) break; if(H[i] > H[i-1]){ if(asc) spec = i; else spec = -1; }else{ asc = 0; } } lw.resize(N+1); mn.assign(20, vector<pair<int, int>>(N)); for(int k = 0; k < 20; k++){ for(int i = 0; i < N; i++){ if(k == 0) mn[k][i] = {H[i], i}; else{ if(i - (1 << (k-1)) < 0) mn[k][i] = mn[k-1][i]; else{ mn[k][i] = max(mn[k-1][i], mn[k-1][i - (1 << (k-1))]); } } } } int pw = 0; int curr = 2; for(int i = 1; i <= N; i++){ if(i == curr){ pw++; curr *= 2; } lw[i] = pw; } } pair<int, int> dnc(int L, int R, int D) { if(L == R) { return {H[L], 1}; }else if(L > R){ return {2e9, 0}; } pair<int, int> pr = get_mx(L, R); int mx = pr.first; int ind = pr.second; pair<int, int> ans1 = dnc(ind + 1, R, D); pair<int, int> ans2 = dnc(L, ind - 1, D); if(ans1.first <= mx - D && ans2.first <= mx - D) return {ans1.first, ans1.second + ans2.second}; else return min(ans1, ans2); } int max_towers(int L, int R, int D) { if(spec == -1) return dnc(L, R, D).second; else{ int ans = 1; if(L < spec && R > spec && H[L] <= H[spec] - D && H[R] <= H[spec] - D) ans++; return ans; } } // int main() { // int N, Q; // assert(2 == scanf("%d %d", &N, &Q)); // std::vector<int> H(N); // for (int i = 0; i < N; ++i) { // assert(1 == scanf("%d", &H[i])); // } // init(N, H); // for (int i = 0; i < Q; ++i) { // int L, R, D; // assert(3 == scanf("%d %d %d", &L, &R, &D)); // printf("%d\n", max_towers(L, R, D)); // } // 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...