제출 #857378

#제출 시각아이디문제언어결과실행 시간메모리
857378abcvuitunggio휴가 (IOI14_holiday)C++17
0 / 100
524 ms4276 KiB
#include"holiday.h" #include <bits/stdc++.h> using namespace std; int ch[100001],n,s,d,a[100001]; long long calc(int k){ for (int i=0;i<n;i++) ch[i]=0; int r=min(d+s-k,n-1),l=max((s+r-d+k+1)/2,0),cnt=0,dist=s+r-l*2; long long val=0,mx=0; priority_queue <pair <int, int>> q; for (int i=l;i<=r;i++) q.push({a[i],i}); while (!q.empty()&&cnt<k){ ch[q.top().second]=1; val+=q.top().first; q.pop(); cnt++; } mx=val; for (int i=l-1;i>=0;i--){ dist+=2; while (dist+k>d){ cnt-=ch[r]; val-=ch[r]*a[r]; r--; dist--; } if (r-l+1<k) break; q.push({a[i],i}); while (!q.empty()&&cnt<k){ ch[q.top().second]=1; val+=q.top().first; q.pop(); cnt++; } mx=max(mx,val); } return mx; } long long solve(){ int l=1,r=n-1; long long kq=-1; while (l<=r){ int mid=(l+r)>>1; long long x=calc(mid),y=calc(mid+1); if (x<y){ kq=y; l=mid+1; } else r=mid-1; } return kq; } long long findMaxAttraction(int N, int start, int D, int attraction[]){ n=N; s=start; d=D; for (int i=0;i<n;i++) a[i]=attraction[i]; long long res=solve(); reverse(a,a+n); s=n-s-1; return max(res,solve()); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...