제출 #1203334

#제출 시각아이디문제언어결과실행 시간메모리
1203334Zbyszek99송신탑 (IOI22_towers)C++20
23 / 100
4083 ms11556 KiB
#include "towers.h" #include <bits/stdc++.h> #define ll long long #define ld long double #define vi vector<int> #define vl vector<long long> #define ff first #define ss second #define pii pair<int,int> #define pll pair<long long, long long> #define pb push_back #define rep(i, b) for(int i = 0; i < (b); ++i) #define rep2(i,a,b) for(int i = a; i <= (b); ++i) #define rep3(i,a,b,c) for(int i = a; i <= (b); i+=c) #define count_bits(x) __builtin_popcountll((x)) #define all(x) (x).begin(),(x).end() #define siz(x) (int)(x).size() #define forall(it,x) for(auto& it:(x)) using namespace std; //mt19937 mt;void random(){mt.seed(chrono::time_point_cast<chrono::milliseconds>(chrono::high_resolution_clock::now()).time_since_epoch().count());} //ll rand(ll a, ll b) {return a + (mt() % (b-a+1));} const int INF = 1e9+50; const ll INF_L = 1e18+40; const ll MOD = 1e9+7; const int tree_siz = 1024*256-1; struct mmtree { pii dmax[tree_siz+1]; pii dmin[tree_siz+1]; void setup(vi arr) { rep(i,siz(arr)) { dmax[tree_siz/2+1+i] = {arr[i],i}; dmin[tree_siz/2+1+i] = {arr[i],i}; } rep2(i,tree_siz/2+1+siz(arr),tree_siz) { dmax[i] = {-2e9,i}; dmin[i] = {2e9,i}; } for(int i = tree_siz/2; i >= 1; i--) { dmax[i] = max(dmax[i*2],dmax[i*2+1]); dmin[i] = min(dmin[i*2],dmin[i*2+1]); } } pair<pii,pii> query(int akt, int p1, int p2, int s1, int s2) { if(p2 < s1 || p1 > s2) return {{2e9,1},{-2e9,1}}; if(p1 >= s1 && p2 <= s2) return {dmin[akt],dmax[akt]}; pair<pii,pii> w1 = query(akt*2,p1,(p1+p2)/2,s1,s2); pair<pii,pii> w2 = query(akt*2+1,(p1+p2)/2+1,p2,s1,s2); return {min(w1.ff,w2.ff),max(w1.ss,w2.ss)}; } pair<pii,pii> get_info(int l, int r) { return query(1,0,tree_siz/2,l,r); } }; int n; int left_D[100'001]; int right_D[100'001]; mmtree mtree; void init(int N, vi H) { n = N; mtree.setup(H); vector<pii> sort_poz; rep(i,n) sort_poz.pb({H[i],i}); sort(all(sort_poz)); set<int> s; forall(it,sort_poz) { auto ptr = s.lower_bound(it.ss); if(ptr == s.end()) { right_D[it.ss] = 1e9; } else { int nxt = *ptr; int max_ = mtree.get_info(it.ss,nxt-1).ss.ff; right_D[it.ss] = max_ - it.ff; } if(ptr == s.begin()) { left_D[it.ss] = 1e9; } else { ptr--; int prev = *ptr; int max_ = mtree.get_info(prev+1,it.ss).ss.ff; left_D[it.ss] = max_-it.ff; } s.insert(it.ss); } } int max_towers(int L, int R, int D) { int ans = 0; int first_ = 1e9; int last_ = 0; rep2(i,L,R) { if(left_D[i] >= D && right_D[i] >= D) { ans++; first_ = min(first_,i); last_ = i; } } if(ans == 0) { int min_poz = mtree.get_info(L,R).ff.ss; ans++; last_ = min_poz; first_ = min_poz; } rep2(i,L,first_-1) { if(right_D[i] >= D) { ans++; break; } } rep2(i,last_+1,R) { if(left_D[i] >= D) { ans++; break; } } return ans; }
#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...