萌新求助,样例不过,呜
查看原帖
萌新求助,样例不过,呜
365532
Mr_ll楼主2022/7/16 16:22
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int N=1e5+10;
const LL INF=1e9+10;
int n,m,s[N],f[20][N][5];
LL xo,h[N],x[N],da[20][N][5],db[20][N][5];
struct qwe{
	int id;
	LL h;
	friend bool operator <(qwe a,qwe b){
		return a.h<b.h;
	}
};
multiset<qwe> q;
void scan(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%lld",&h[i]);
	scanf("%lld",&xo);
	scanf("%d",&m);
	for(int i=1;i<=m;i++) scanf("%d%lld",&s[i],&x[i]);
}
void yucl(){
	h[0]=INF,h[n+1]=-INF;
	qwe sta;
	sta.id=0;sta.h=INF;
	q.insert(sta),q.insert(sta);
	sta.id=n+1;sta.h=-INF;
	q.insert(sta);q.insert(sta);
	for(int i=n;i;i--){
		int ga,gb;
		qwe now;
		now.id=i;now.h=h[i];
		q.insert(now);
		set<qwe>::iterator it=q.lower_bound(now);
		it--;
		int lt=(*it).id,lh=(*it).h;
		it++,it++;
		int ne=(*it).id,nh=(*it).h;
		it--;
		if(abs(nh-h[i])>=abs(h[i]-lh)){
			gb=lt;
			it--,it--;
			if(abs(nh-h[i])>=abs(h[i]-(*it).h)) ga=(*it).id;
			else ga=ne;
		}
		else{
			gb=ne;
			it++,it++;
			if(abs((*it).h-h[i])>=abs(h[i]-lh)) ga=lt;
			else ga=(*it).id;
		}
		f[0][i][0]=ga,f[0][i][1]=gb;
		da[0][i][0]=abs(h[i]-h[ga]);
		db[0][i][1]=abs(h[i]-h[gb]);
	}
}
void DP(){
	for(int i=1;i<=18;i++)
	for(int j=1;j<=n;j++)
	for(int k=0;k<2;k++)
	if(i==1){
		f[i][j][k]=f[i-1][f[i-1][j][k]][1-k];
		da[i][j][k]=da[i-1][j][k]+da[i-1][f[i-1][j][k]][1-k];
		db[i][j][k]=db[i-1][j][k]+db[i-1][f[i-1][j][k]][1-k];
	}
	else{
		f[i][j][k]=f[i-1][f[i-1][j][k]][k];
		da[i][j][k]=da[i-1][j][k]+da[i-1][f[i-1][j][k]][k];
		db[i][j][k]=db[i-1][j][k]+db[i-1][f[i-1][j][k]][k];
	}
}
void query(int Q,LL S){
	LL la=0,lb=0;
	for(int i=18;i>=0;i--){
		if(f[i][Q][0]&&la+lb+da[i][Q][0]+db[i][Q][0]<=S){
			Q=f[i][Q][0];
			la+=da[i][Q][0];
			lb+=db[i][Q][0];
		}
	}
	printf("%lld %lld\n",la,lb);
}
void que1(){
	int id=0;
	double an=(double)(1000000010);
	for(int k=1;k<=n;k++){
		LL la=0,lb=0;
		int Q=k;
		for(int i=18;i>=0;i--){
			if(f[i][Q][0]&&la+lb+da[i][Q][0]+db[i][Q][0]<=xo){
				Q=f[i][Q][0];
				la+=da[i][Q][0];
				lb+=db[i][Q][0];
			}
		}
		if((double)la/(double)lb<an) an=(double)la/(double)lb,id=k,cout<<an<<endl;
	}
	printf("%d\n",id);
}
void que2(){
	for(int i=1;i<=m;i++)
	query(s[i],x[i]);
}
int main(){
	scan();
	yucl();
	DP();
	que1();
	que2();
	return 0;
}
2022/7/16 16:22
加载中...