제출 #1234296

#제출 시각아이디문제언어결과실행 시간메모리
1234296dosts송신탑 (IOI22_towers)C++20
0 / 100
248 ms10900 KiB
#include "towers.h" #include <bits/stdc++.h> #pragma GCC optimize("O3,unroll-loops") #pragma GCC target("avx2") //#define int long long #define pii pair<int,int> #define vi vector<int> #define ff first #define ss second #define sp << " " << #define all(x) x.begin(),x.end() #define big(x) ((int)(x.size())) using namespace std; const int MOD = 1e9+7, inf = 2e9,LIM = 2001; vi h; int up[100001][18]; int rmq(int l,int r) { if (l > r) return -inf; int lg = __lg(r-l+1); return max(up[l][lg],up[r-(1<<lg)+1][lg]); } vi vect,takevect; void init(int N, std::vector<int> H) { h = H; for (int i = 0;i<N;i++) up[i][0] = H[i]; for (int i=1;i<=17;i++) { for (int j=0;j+(1<<(i-1))<N;j++) up[j][i] = max(up[j][i-1],up[j+(1<<(i-1))][i-1]); } int ans = 0; vector<pii> ps; for (int j=0;j<N;j++) { ps.push_back({h[j],j}); } sort(all(ps)); set<int> taken; for (auto& [v,p] : ps) { int fl = 1; auto it = taken.upper_bound(p); auto it2 = taken.lower_bound(p); if (it != taken.end()) { int mx = rmq(p+1,*it-1); if (mx < h[p]+1 || mx < h[*it]+1) fl = 0; } if (it2 != taken.begin()) { --it2; int mx = rmq(*it2+1,p-1); if (mx < h[p]+1 || mx < h[*it2]+1) fl = 0; } if (fl) { ans++; taken.insert(p); } } takevect = vi(all(taken)); } int max_towers(int L, int R, int D) { auto it = upper_bound(all(takevect),R); auto it2 = lower_bound(all(takevect),L); return distance(it2,it); }
#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...