萌新求助,WA1个点
查看原帖
萌新求助,WA1个点
135258
charm1楼主2021/2/1 21:16

rt

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int lnx=21;
const int maxn=100005;
const int INF=(int)(1e15);
int n,t,s,sa,sb,x,maxx,maxa,maxb;
int ga[maxn],gb[maxn];
int g[maxn][lnx][2],da[maxn][lnx][2],db[maxn][lnx][2],d[maxn][lnx][2];//0轮A,1轮B 
struct city{
	int h;
	int pos,pre,nxt;
}a[maxn];
bool cmp1(city x,city y){
	return x.h<y.h;
}
bool cmp2(city x,city y){
	return x.pos<y.pos;
}
inline int read(){
	int ret=0,f=1;	char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
	while(isdigit(ch)){ret=ret*10+ch-'0';ch=getchar();}
	return ret*f; 
}
void scan(){
	int k,j,i;
	n=read();
	for(k=1;k<=n;k++)	a[k].h=read(),a[k].pos=k;
}
void calc(){
	int k,j,i;
	sort(a+1,a+n+1,cmp1);
	for(k=1;k<=n;k++)	a[k].pre=a[k-1].pos,a[k].nxt=a[k+1].pos;
	sort(a+1,a+n+1,cmp2);
}
void del(int x){
	a[a[x].pre].nxt=a[x].nxt;
	a[a[x].nxt].pre=a[x].pre;
}
bool pd(int x){
	return x==0||x==n+1;
}
int dist(int x,int y){
	if(pd(y))	return INF;
	return abs(a[x].h-a[y].h);
}
void prework1(){
	int k,j,i;
	calc();
	for(k=1;k<=n;del(k),k++){
		int pr =a[k ].pre,nx =a[k ].nxt;
		int pre=a[pr].pre,nxt=a[nx].nxt;
		if(dist(k,pr)>dist(k,nx)){
			gb[k]=nx;
			if(dist(k,pr)>dist(k,nxt))	ga[k]=nxt;
			else						ga[k]=pr;
		}
		else{
			gb[k]=pr;
			if(dist(k,pre)<dist(k,nx))	ga[k]=pre;
			else						ga[k]=nx;
		}
	}
}
void prework2(){
	int k,j,i;
	for(k=1;k<=n;k++)
	g[k][0][0]=ga[k],da[k][0][0]=dist(k,ga[k]),
	g[k][0][1]=gb[k],db[k][0][1]=dist(k,gb[k]);
	for(k=1;k<lnx;k++){
		da[0][k-1][0]=da[0][k-1][1]=db[0][k-1][0]=db[0][k-1][1]=INF;
		da[n+1][k-1][0]=da[n+1][k-1][1]=db[n+1][k-1][0]=db[n+1][k-1][1]=INF;		
		for(j=1;j<=n;j++){
			if(k==1){
				g [j][k][0]=g [g [j][k-1][0]][k-1][1];
				g [j][k][1]=g [g [j][k-1][1]][k-1][0];
				da[j][k][0]=da[g [j][k-1][0]][k-1][1]+da[j][k-1][0];
				da[j][k][1]=da[g [j][k-1][1]][k-1][0]+da[j][k-1][1];
				db[j][k][0]=db[g [j][k-1][0]][k-1][1]+db[j][k-1][0];
				db[j][k][1]=db[g [j][k-1][1]][k-1][0]+db[j][k-1][1];
				}
			else{
				g [j][k][0]=g [g [j][k-1][0]][k-1][0];
				g [j][k][1]=g [g [j][k-1][1]][k-1][1];
				da[j][k][0]=da[g [j][k-1][0]][k-1][0]+da[j][k-1][0];
				da[j][k][1]=da[g [j][k-1][1]][k-1][1]+da[j][k-1][1];
				db[j][k][0]=db[g [j][k-1][0]][k-1][0]+db[j][k-1][0];
				db[j][k][1]=db[g [j][k-1][1]][k-1][1]+db[j][k-1][1];			
			}
		}
	}
}
void find(int x){
	int k,j,i;
	sa=0;	sb=0;
	for(k=lnx-1;k>=0;k--)
	if(da[x][k][0]+db[x][k][0]+sa+sb<=s){
//		cout<<x<<" "<<sa<<" "<<sb<<endl;		
		sa+=da[x][k][0];
		sb+=db[x][k][0];
		x  =g [x][k][0];
	}
//	cout<<x<<" "<<sa<<" "<<sb<<endl;			
}
bool pd(){
	if(!maxx)	return 1;
	if(!sa)		return 0;
	if(sa*maxb<sb*maxa)	return 1;
	if(sa*maxb>sb*maxa)	return 0;
	return a[x].h>a[maxx].h;
}
void solve1(){
	int k,j,i;
	s=read();
	for(k=1;k<=n;k++){
		x=k;	find(x);
		if(pd()){
			maxx=k;
			maxa=sa;
			maxb=sb;
		}
	}
	printf("%d\n",maxx);
}
void solve2(){
	t=read();
	while(t--){
		x=read();	s=read();
		find(x);
		printf("%lld %lld\n",sa,sb);
	}
}
signed main(){
	int k,j,i;
	scan();	prework1();	prework2();	solve1();	solve2();
	return 0;
}
2021/2/1 21:16
加载中...