10分求调
查看原帖
10分求调
467418
ifxxx楼主2023/7/16 14:12
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int kmaxn=1e5+10,kl=31,Ma=INT_MAX*3;
int n,h[kmaxn],A[kmaxn],B[kmaxn],anr;
struct node{
	int Asum,Bsum,to;
}w[kmaxn][kl][2];
map<int,int>to;
set<int>lp,rp;
int pi[5];
int nn=0,Aan[kmaxn],Ban[kmaxn];
bool cmp(int x,int y){
	return (abs(h[nn]-x)==abs(h[nn]-y)?x<y:abs(h[nn]-x)<abs(h[nn]-y));
}
signed main(){
	cin>>n;
	to[-Ma]=0;
	to[-Ma-1]=0;
	to[Ma]=0;
	to[Ma+1]=0;
	h[0]=Ma; 
	lp.insert(Ma);
	lp.insert(Ma+1);
	rp.insert(Ma);
	rp.insert(Ma-1);
	for(int i=1;i<=n;i++){
		cin>>h[i];
		to[h[i]]=i;
	}
	for(int i=n;i>=1;i--){
		lp.insert(h[i]);
		rp.insert(-h[i]);
		nn=i;
		pi[1]=*lp.upper_bound(h[i]);
		pi[2]=*lp.upper_bound(pi[1]);
		pi[3]=*rp.upper_bound(-h[i])*-1;
		pi[4]=*rp.upper_bound(-pi[3])*-1;
		sort(pi+1,pi+5,cmp);
		if(to[pi[1]]==0){
			w[i][0][1].to=0;
		}else{
			w[i][0][1].to=to[pi[1]];
			w[i][0][1].Bsum=abs(pi[1]-h[i]);
		}
		if(to[pi[2]]==0){
			w[i][0][0].to=0;
		}else{
			w[i][0][0].to=to[pi[2]];
			w[i][0][0].Asum=abs(pi[2]-h[i]);
		}
	}
	for(int i=1;i<kl;i++){
		if(i>1){
			for(int j=1;j<=n;j++){
				w[j][i][1].to=w[w[j][i-1][1].to][i-1][1].to;
				w[j][i][1].Asum=w[j][i-1][1].Asum+w[w[j][i-1][1].to][i-1][1].Asum;
				w[j][i][1].Bsum=w[j][i-1][1].Bsum+w[w[j][i-1][1].to][i-1][1].Bsum;
				w[j][i][0].to=w[w[j][i-1][0].to][i-1][0].to;
				w[j][i][0].Asum=w[j][i-1][0].Asum+w[w[j][i-1][0].to][i-1][0].Asum;
				w[j][i][0].Bsum=w[j][i-1][0].Bsum+w[w[j][i-1][0].to][i-1][0].Bsum;
				
			}
		}
		for(int j=1;j<=n;j++){
			w[j][i][1].to=w[w[j][i-1][1].to][i-1][0].to;
			w[j][i][1].Asum=w[j][i-1][1].Asum+w[w[j][i-1][1].to][i-1][0].Asum;
			w[j][i][1].Bsum=w[j][i-1][1].Bsum+w[w[j][i-1][1].to][i-1][0].Bsum;
			w[j][i][0].to=w[w[j][i-1][0].to][i-1][1].to;
			w[j][i][0].Asum=w[j][i-1][0].Asum+w[w[j][i-1][0].to][i-1][1].Asum;
			w[j][i][0].Bsum=w[j][i-1][0].Bsum+w[w[j][i-1][0].to][i-1][1].Bsum;
			
		}
	}
	int x;
	cin>>x;
	anr=1; 
	for(int i=1;i<=n;i++){
		int now=i,A=0,B=0;
		now=i,A=0,B=0;
		int qp=0;
		for(int j=kl-1;j>=0;j--){
			if(w[now][j][qp].Asum+w[now][j][qp].Bsum+A+B<=x&&w[now][j][qp].to!=0){
				A+=w[now][j][qp].Asum;
				B+=w[now][j][qp].Bsum;
				now=w[now][j][qp].to;
			}
		}
		Aan[i]=A;
		Ban[i]=B;
		if(Ban[i]==0){
			Aan[i]=Ma/3;
		}
		if((Aan[anr]*Ban[i]==Aan[i]*Ban[anr]&&h[i]>h[anr])||(Aan[anr]*Ban[i]>Aan[i]*Ban[anr])){
			anr=i;
		}
	}
	cout<<anr<<endl;
	int q;
	cin>>q;
	while(q--){
		int y;
		cin>>y>>x;;
		for(int i=y;i<=y;i++){
			int now=i,A=0,B=0;
			now=i,A=0,B=0;
			int qp=0;
			for(int j=kl-1;j>=0;j--){
				if(w[now][j][qp].Asum+w[now][j][qp].Bsum+A+B<=x&&w[now][j][qp].to!=0){
					A+=w[now][j][qp].Asum;
					B+=w[now][j][qp].Bsum;
					now=w[now][j][qp].to;
				}
			}
			cout<<A<<" "<<B<<endl;
		}
		
	}
	return 0;
} 
2023/7/16 14:12
加载中...