Submission #858905

#TimeUsernameProblemLanguageResultExecution timeMemory
858905Ahmed57Krov (COCI17_krov)C++17
126 / 140
725 ms35688 KiB
#include <bits/stdc++.h> #pragma GCC optimize ("trapv") using namespace std; int cn = 0; struct lol{ long long sum[600001] = {0},cnt[600001] = {0}; void addSum(int e,int v){ while(e<=cn){ sum[e]+=v; e+=e&-e; } }void addcnt(int e,int v){ while(e<=cn){ cnt[e]+=v; e+=e&-e; } }long long querysum(int e){ long long res = 0; while(e>=1){ res+=sum[e]; e-=e&-e; } return res; }long long querycnt(int e){ long long res = 0; while(e>=1){ res+=cnt[e]; e-=e&-e; } return res; } }pref,suf; int main(){ ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0); int n; cin>>n; long long arr[n]; for(int i = 0;i<n;i++){ cin>>arr[i]; } long long rev[n*3+1] = {0}; map<int,int> sav;set<int> comp; vector<int> re,dr; for(int i = 0;i<n;i++){comp.insert(arr[i]-i);comp.insert(arr[i]+i);re.push_back(arr[i]+i);dr.push_back(arr[i]-i);dr.push_back(max(i+1,(n-i))-i);comp.insert(max(i+1,(n-i))-i);} for(auto i:comp){ sav[i] = ++cn; rev[cn] = i; } long long val[n] = {0}; for(int i = 0;i<n;i++){ suf.addSum(sav[arr[i]+i],arr[i]+i); suf.addcnt(sav[arr[i]+i],1); } sort(re.begin(),re.end()); sort(dr.begin(),dr.end()); long long mi = 1e18; for(int i = 0;i<n;i++){ suf.addSum(sav[arr[i]+i],-(arr[i]+i)); suf.addcnt(sav[arr[i]+i],-1); pref.addSum(sav[arr[i]-i],arr[i]-i); pref.addcnt(sav[arr[i]-i],1); int ze = max(i+1,(n-i))-i; int l = 1, r = cn , ans = 0; l = lower_bound(dr.begin(),dr.end(),ze)-dr.begin(); l = sav[dr[l]]; while(l<=r){ int mid = (l+r)/2; int it = lower_bound(re.begin(),re.end(),rev[mid]+2*i+1)-re.begin()-1; if(pref.querycnt(mid)+(it>=0?suf.querycnt(sav[re[it]]):0)>=(n+1)/2){ ans = mid; r = mid-1; }else l = mid+1; } //cout<<rev[ans]<<" "<<pref.querycnt(ans)+suf.querycnt(ans+2*i)<<endl; long long CNT = pref.querycnt(ans) , SUM = pref.querysum(ans); long long lo = 0; lo+=(rev[ans])*CNT-SUM; CNT = pref.querycnt(cn)-CNT; SUM = pref.querysum(cn)-SUM; lo+=SUM-rev[ans]*CNT; //cout<<lo<<endl; int it = lower_bound(re.begin(),re.end(),rev[ans]+2*i+1)-re.begin()-1; int de = (it>=0?sav[re[it]]:0); CNT = suf.querycnt(de) , SUM = suf.querysum(de); lo+=(rev[ans]+2*i)*CNT-SUM; CNT = suf.querycnt(cn)-CNT; SUM = suf.querysum(cn)-SUM; lo+=SUM-(rev[ans]+2*i)*CNT; //cout<<lo<<endl; mi = min(mi,lo); } cout<<mi<<endl; } /* 4 5 7 2 2 pref : 4 4 5 -1 -2 suf : 4 6 9 5 6 rev[ans]+2*i 1: 5 2 , 3 , 4 , 5 : 3 */

Compilation message (stderr)

krov.cpp: In function 'int main()':
krov.cpp:50:15: warning: unused variable 'val' [-Wunused-variable]
   50 |     long long val[n] = {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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...