[交互题] 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
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


你可能感兴趣的:(交互题&提交答案题)