95pts WA#8 求助
查看原帖
95pts WA#8 求助
480015
是WXD楼主2022/10/10 09:05

rt

#include <set>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#define ll long long
#define maxn 100005
using namespace std;
int n,m,x0;
int la,lb,ri;
int h[maxn];
int s[maxn];
int x[maxn];
int f[20][maxn][3];
int da[20][maxn][3];
int db[20][maxn][3];

inline ll re(){
	register ll k=0,f=1ll;
	register char c=getchar();
	while(!isdigit(c)){
		if(c=='-') f=-1ll;
		c=getchar();
	}
	while(isdigit(c)){
		k=k*10ll+(c^48ll);
		c=getchar();
	}
	return 1ll*k*f;
}

void wr(ll x){
	if(x<0){
		x=~x+1;
		putchar('-');
	}
	if(x>9) wr(x/10ll);
	putchar(x%10ll^48ll);
}

struct City{
	int id,al;
	friend bool operator <(City x,City y){
		return x.al<y.al;
	}
};
multiset<City> ms;

inline void init_(){
	h[0]=2e9+1e8,h[n+1]=-2e9-1e8;
	City st;
	st.id=0,st.al=h[0];
	ms.insert(st),ms.insert(st);
	st.id=n+1,st.al=h[n+1];
	ms.insert(st),ms.insert(st);
	for(int i=n;i;--i){
		int ga,gb;
		City now;
		now.id=i,now.al=h[i];
		ms.insert(now);
		multiset<City>::iterator p=ms.lower_bound(now);	//指向now 
		--p;	//前驱 
		int pr=(*p).id,ph=(*p).al;
		++p,++p;		//后继 
		int ne=(*p).id,nh=(*p).al;
		--p;	//now
		if(abs(nh-h[i])>=abs(h[i]-ph)){
			gb=pr;
			--p,--p;		//前驱的前驱
			if(abs((*p).al-h[i])>=abs(nh-h[i]))
				ga=ne;
			else
				ga=(*p).id;
		}
		else{
			gb=ne;
			++p,++p;		//后继的后继
			if(abs((*p).al-h[i])>=abs(ph-h[i]))
				ga=pr;
			else
				ga=(*p).id; 
		}
		f[0][i][0]=ga,f[0][i][1]=gb;
		da[0][i][0]=abs(h[ga]-h[i]);
		db[0][i][1]=abs(h[gb]-h[i]);
	}
	for(int i=1;i<=18;++i){
		for(int j=1;j<=n;++j){
			for(int k=0;k<=1;++k){
				if(i==1){
					f[1][j][k]=f[0][f[0][j][k]][1-k];
					da[1][j][k]=da[0][j][k]+da[0][f[0][j][k]][1-k];
					db[1][j][k]=db[0][j][k]+db[0][f[0][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];
				}
			}
		}
	}
}

inline void calc(int s,int x){
	int p=s;
	la=lb=0;
	for(int i=18;~i;--i){
		if(f[i][p][0]&&la+lb+da[i][p][0]+db[i][p][0]<=x){
			la+=da[i][p][0];
			lb+=db[i][p][0];
			p=f[i][p][0];
		}
	}
}

signed main(){
	n=re();
	for(int i=1;i<=n;++i) h[i]=re();
	x0=re(),m=re();
	for(int i=1;i<=m;++i) s[i]=re(),x[i]=re();
	init_();
	double ans=3e9,xw;
	for(int i=1;i<=n;++i){
		calc(i,x0);
		xw=(double)la/(double)lb;
		if(xw<ans){
			ri=i;
			ans=xw;
		}
		else if(xw==ans&&h[i]>h[ri]) ri=i;
	}
	wr(ri);
	putchar('\n');
	for(int i=1;i<=m;++i){
		calc(s[i],x[i]);
		wr(la),putchar(' '),wr(lb),putchar('\n');
	}
	return 0;
}

2022/10/10 09:05
加载中...