1. 程式人生 > >[互動題] APIO2016 Gap

[互動題] APIO2016 Gap

看題解

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;
}