求救样例2 0输出2 1
查看原帖
求救样例2 0输出2 1
49468
寻旧楼主2020/12/3 22:43

RT 99 孩子吧

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL read()
{
	LL w=0;bool f=true;char c=getchar();
	while(!isdigit(c)){if(c=='-')f=false;c=getchar();}
	while(isdigit(c))w=(w<<1)+(w<<3)+(c^48),c=getchar();
	return f?w:~w+1;
}
const int N=1e5+66;
const LL INF=1e18;

LL n,m,x0,h[N];
struct city
{
	LL h,id;
	friend bool operator <(city n1,city n2){return n1.h<n2.h;}
}a[N];

LL dis[2][N][33],f[2][N][33];
int l[N],r[N];

void pre()
{
	sort(a+1,a+n+1);
	for(int i=1;i<=n;++i) l[a[i].id]=a[i-1].id,r[a[i].id]=a[i+1].id;
	
	for(int i=1;i<=n;++i)
	{
		LL sta[5],fir=INF,sec=INF,id_fir,id_sec;
		
		sta[1]=l[l[i]]? h[i]-h[l[l[i]]] :INF;
		sta[2]=l[i]? h[i]-h[l[i]] :INF;
		sta[3]=r[i]? h[r[i]]-h[i] :INF;
		sta[4]=r[r[i]]? h[r[r[i]]]-h[i] :INF;
		
		for(int j=1;j<=4;++j)
		  if(fir>sta[j]) fir=sta[j],id_fir=j;
		for(int j=1;j<=4;++j)
		  if(sec>sta[j]&&j!=id_fir) sec=sta[j],id_sec=j;
		
		if(id_fir==1) f[1][i][0]=l[l[i]];
		if(id_fir==2) f[1][i][0]=l[i];
		if(id_fir==3) f[1][i][0]=r[i];
		if(id_fir==4) f[1][i][0]=r[r[i]];
		
		if(id_sec==1) f[0][i][0]=l[l[i]];
		if(id_sec==2) f[0][i][0]=l[i];
		if(id_sec==3) f[0][i][0]=r[i];
		if(id_sec==4) f[0][i][0]=r[r[i]];
		
		if(f[1][i][0]) dis[1][i][0]=fir;
		if(f[0][i][0]) dis[0][i][0]=sec;
		
		if(l[i]) r[l[i]]=r[i];
		if(r[i]) l[r[i]]=l[i];
	}
}

void work()
{
	for(int i=1;i<=n;++i)
	{
		f[0][i][1]=f[1][f[0][i][0]][0];
		dis[0][i][1]=dis[0][i][0];
		dis[1][i][1]=dis[1][f[0][i][0]][0];
	}
	for(int j=2;j<=30;++j)
	  for(int i=1;i<=n;++i)
      {
      	f[0][i][j]=f[0][f[0][i][j-1]][j-1];
      	dis[0][i][j]=dis[0][i][j-1]+dis[0][f[0][i][j-1]][j-1];
      	dis[1][i][j]=dis[1][i][j-1]+dis[1][f[0][i][j-1]][j-1];
	  }
}

void solve1()
{
	x0=read();
	double Ans=0x7fffffff;
	int pos=0;
	for(int i=1;i<=n;++i)
	{
		LL s1=0,s2=0,x=x0;int s=i;
		for(int j=30;j>=0;--j)
		  if(f[0][s][j]!=0&&dis[0][s][j]+dis[1][s][j]<=x)
	  	  {
	  		s1+=dis[0][s][j];s2+=dis[1][s][j];
	  		x-=dis[0][s][j]+dis[1][s][j];
	  		s=f[0][s][j];
	      }
	    if(s2==0)
	    {
	    	if(pos==0) pos=i;
		}
		else
		{
			double temp=(s1*1.0)/(s2*1.0);
			if(Ans>temp) Ans=temp,pos=i;	
		}
	}  
	printf("%d\n",pos);
}

void solve2(int s,LL x)
{
	LL s1=0,s2=0;
	for(int i=30;i>=0;--i)
	  if(f[0][s][i]!=0&&dis[0][s][i]+dis[1][s][i]<=x)
	  {
	  	s1+=dis[0][s][i];s2+=dis[1][s][i];
	  	x-=dis[0][s][i]+dis[1][s][i];
	  	s=f[0][s][i];
	  }
	printf("%lld %lld\n",s1,s2);
}

int main()
{
	freopen("travel.out","w",stdout);
	
	n=read();
	for(int i=1;i<=n;++i) h[i]=read(),a[i]=(city){h[i],i};
	
	pre();
	
	work();
	
	solve1();
	
	m=read();
	for(int i=1;i<=m;++i)
	{
		int s=read();LL x=read();
		solve2(s,x);
	}
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}
2020/12/3 22:43
加载中...