Submission #1223809

#TimeUsernameProblemLanguageResultExecution timeMemory
1223809Zbyszek99Holiday (IOI14_holiday)C++20
23 / 100
674 ms8880 KiB
#include"holiday.h" #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #define ll long long #define ld long double #define ull unsigned long long #define ff first #define ss second #define pii pair<int,int> #define pll pair<long long, long long> #define vi vector<int> #define vl vector<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 __gnu_pbds; using namespace std; typedef tree<int, null_type, less<int>, rb_tree_tag,tree_order_statistics_node_update> ordered_set; //mt19937 mt;void random_start(){mt.seed(chrono::time_point_cast<chrono::milliseconds>(chrono::high_resolution_clock::now()).time_since_epoch().count());} //ll los(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; ll real_val[(1 << 17)]; struct node { int l = 0; int r = (1<< 17)-1; node* left; node* right; ll sum = 0; int elms = 0; bool is_sons = 0; void upd() { if(!is_sons) { left = new node; left -> l = l; left -> r = (l+r)/2; right = new node; right -> l = (l+r)/2+1; right -> r = r; } is_sons = 1; } void change(int x, int d) { if(l == r) { sum += d*real_val[x]; elms += d; return; } upd(); if((l+r)/2 >= x) left -> change(x,d); else right -> change(x,d); sum = left -> sum + right -> sum; elms = left -> elms + right -> elms; } ll get_kth_sum(int k) { if(l == r) { return (ll)min(k,elms)*real_val[l]; } upd(); if(right -> elms >= k) return right -> get_kth_sum(k); else return right -> sum + left -> get_kth_sum(k-right->elms); } }; int arr[100001]; ll left_val[2][250001]; ll right_val[2][250001]; node segtree; int S,D; void solve(int l, int r, int l_opt, int r_opt, int type, ll cost, ll* ansT) { if(l > r) return; int mid = (l+r)/2; pll best = {-1e18,l_opt}; if(type == -1) { for(int i = r_opt; i >= l_opt; i--) { segtree.change(arr[i],1); ll new_val = segtree.get_kth_sum(mid - cost*(S - i)); if(new_val > best.ff) { best = {new_val,i}; } } ansT[mid] = best.ff; rep2(i,l_opt,best.ss) { segtree.change(arr[i],-1); } solve(mid+1,r,l_opt,best.ss,type,cost,ansT); rep2(i,best.ss+1,r_opt) { segtree.change(arr[i],-1); } solve(l,mid-1,best.ss,r_opt,type,cost,ansT); } else { rep2(i,l_opt,r_opt) { segtree.change(arr[i],1); ll new_val = segtree.get_kth_sum(mid - cost*(i - S)); if(new_val > best.ff) { best = {new_val,i}; } } ansT[mid] = best.ff; rep2(i,best.ss,r_opt) { segtree.change(arr[i],-1); } solve(mid+1,r,best.ss,r_opt,type,cost,ansT); rep2(i,l_opt,best.ss-1) { segtree.change(arr[i],-1); } solve(l,mid-1,l_opt,best.ss,type,cost,ansT); } } ll findMaxAttraction(int n, int start, int d, int attraction[]) { rep(i,n) arr[i] = attraction[i]; map<int,int> tree_val; vi ar2; rep(i,n) ar2.pb(arr[i]); sort(all(ar2)); int pop = -1; int cur_ = 0; forall(it,ar2) { if(it != pop) { real_val[cur_] = it; tree_val[it] = cur_; cur_++; } pop = it; } rep(i,n) arr[i] = tree_val[arr[i]]; D = d; S = start; solve(0,d,0,start,-1,1,left_val[0]); solve(0,d,0,start,-1,2,left_val[1]); solve(0,d,start+1,n-1,1,1,right_val[0]); solve(0,d,start+1,n-1,1,2,right_val[1]); ll ans = 0; rep2(i,0,d) { ans = max(ans,left_val[1][i]+right_val[0][d-i]); ans = max(ans,left_val[0][i]+right_val[1][d-i]); } 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...