[互動題] APIO2016 Gap
阿新 • • 發佈:2018-12-24
看題解
l1. 詢問[0,10^18],得到最小值t1,最大值s1,代價為N+1 l2. 設L = [(s1-t1)/N](向上取整),由於最終的答案一定會大於等於平均值L,所以當我們考慮一段長度為L的區間時,只用關心區間內的最小值和最大值即可。 l所以詢問[t1+1,t1+L],[t1+L+1,t1+2L]...,總共詢問不超過N次,覆蓋總點數為N-2(去掉t1和s1)。 總共花費代價:N+1+N+N-2 = 3N-1#include "gap.h" #include<algorithm> using namespace std; typedef long long ll; const int iN=200005; ll tot,a[iN]; ll findGap(int T, int N){ ll minv,maxv; MinMax(0,(ll)1e18,&minv,&maxv); tot=0; if (T==1){ a[1]=minv; a[N]=maxv; for (int i=2,j=N-1;i<=j;i++,j--){ MinMax(minv+1,maxv-1,&minv,&maxv); a[i]=minv; a[j]=maxv; } tot=N; } else{ ll L=(maxv-minv-1)/N+1; ll Min=minv,Max=maxv; a[++tot]=Min; for (ll i=Min;i+1<=Max-1;i=i+L){ MinMax(i+1,min(i+L,Max-1),&minv,&maxv); if (maxv==-1 && minv==-1) continue; a[++tot]=minv; a[++tot]=maxv; } a[++tot]=Max; } ll ans=0; for (int i=1;i<tot;i++) ans=max(ans,a[i+1]-a[i]); return ans; }