제출 #971839

#제출 시각아이디문제언어결과실행 시간메모리
971839GrindMachine코끼리 (Dancing Elephants) (IOI11_elephants)C++17
100 / 100
3438 ms26508 KiB
#pragma GCC optimize("O3,unroll-loops") #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; template<typename T> using Tree = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; typedef long long int ll; typedef long double ld; typedef pair<int,int> pii; typedef pair<ll,ll> pll; #define fastio ios_base::sync_with_stdio(false); cin.tie(NULL) #define pb push_back #define endl '\n' #define sz(a) (int)a.size() #define setbits(x) __builtin_popcountll(x) #define ff first #define ss second #define conts continue #define ceil2(x,y) ((x+y-1)/(y)) #define all(a) a.begin(), a.end() #define rall(a) a.rbegin(), a.rend() #define yes cout << "Yes" << endl #define no cout << "No" << endl #define rep(i,n) for(int i = 0; i < n; ++i) #define rep1(i,n) for(int i = 1; i <= n; ++i) #define rev(i,s,e) for(int i = s; i >= e; --i) #define trav(i,a) for(auto &i : a) template<typename T> void amin(T &a, T b) { a = min(a,b); } template<typename T> void amax(T &a, T b) { a = max(a,b); } #ifdef LOCAL #include "debug.h" #else #define debug(x) 42 #endif /* refs: edi */ const int MOD = 1e9 + 7; const int N = 2e5 + 5; const int inf1 = int(1e9) + 5; const ll inf2 = ll(1e18) + 5; const int B = 455; #include "elephants.h" int n,L; vector<int> a; set<pii> st; vector<pii> blocks[N/B+5]; vector<int> block_num, cams, mx_point; void upd_block(int b){ if(blocks[b].empty()) return; auto &curr = blocks[b]; int siz = sz(curr); int ptr = siz-1; rev(i,siz-1,0){ while(curr[ptr].ff-curr[i].ff > L){ ptr--; } int j = curr[i].ss; if(ptr+1 == siz){ cams[j] = 1; mx_point[j] = curr[i].ff+L; } else{ int k = curr[ptr+1].ss; cams[j] = cams[k]+1; mx_point[j] = mx_point[k]; } } } void build(){ int ind = 0; rep(i,n/B+1){ blocks[i].clear(); } for(auto [x,i] : st){ blocks[ind/B].pb({x,i}); block_num[i] = ind/B; ind++; } rep(b,n/B+1){ upd_block(b); } } void init(int n_, int L_, int X[]) { n = n_; L = L_; a = block_num = cams = mx_point = vector<int>(n); rep(i,n) a[i] = X[i]; rep(i,n) st.insert({a[i],i}); build(); } int upds = 0; int update(int i, int v) { upds++; if(upds%B == 0){ build(); } int b = block_num[i]; { auto &curr = blocks[b]; pii px = {a[i],i}; curr.erase(find(all(curr),px)); upd_block(b); } st.erase({a[i],i}); a[i] = v; st.insert({a[i],i}); auto it = st.find({a[i],i}); if(next(it) != st.end()){ b = block_num[next(it)->ss]; } else if(it != st.begin()){ b = block_num[prev(it)->ss]; } else{ b = 0; } block_num[i] = b; { auto &curr = blocks[b]; pii px = {a[i],i}; curr.insert(upper_bound(all(curr),px),px); upd_block(b); } int mx_reach = -1; int ans = 0; rep(b,n/B+1){ auto &curr = blocks[b]; pii px = {mx_reach+1,-1}; auto it = upper_bound(all(curr),px); if(it == curr.end()){ conts; } int j = it->second; ans += cams[j]; mx_reach = mx_point[j]; } 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...