95pt求助
查看原帖
95pt求助
124918
LinkyChristian楼主2021/11/24 23:13
#include<bits/stdc++.h>
#define N 400010
#define int long long
using namespace std;
struct node{int id,h;}c[N];
int operator<(node a1,node a2) {return (a1.h==a2.h)?a1.id<a2.id:a1.h<a2.h;}
int d(int a1,int a2) {return a1-a2<0?a2-a1:a1-a2;}
int n,m,x0,f[N][22][2],db[N][22][2],da[N][22][2],t1,t2,t3,INF=1e16,his=-INF,ansid;
multiset<node> st;
set<node>::iterator IT,nxt,nxtt,pre,pree;
double bis=INF*1.0;
node solve(int id,int num) {
	node ans;
	ans.id=ans.h=0;
	for(int i=20; i>=0; i--)
	    if(f[id][i][1]!=-1&&num-db[id][i][1]-da[id][i][1]>=0) 
		    ans.id+=da[id][i][1],ans.h+=db[id][i][1],
			num=num-db[id][i][1]-da[id][i][1],id=f[id][i][1];
	return ans; 
}
signed main()
{
//	freopen("1081_8.in","r",stdin);
//	freopen("output.txt","w",stdout);
	cin>>n;
	for(int i=1; i<=n; i++) {
		cin>>c[i].h;
		c[i].id=i;
	}
    st.insert(node{-1,INF}),st.insert(node{-1,INF});;
    st.insert(node{-1,-INF}),st.insert(node{-1,-INF});
    for(int i=n; i>=1; i--) {
    	st.insert(c[i]);
    	IT=st.lower_bound(c[i]),nxt=++IT,nxtt=++IT,--IT,--IT,pre=--IT,pree=--IT,++IT,++IT;
		if((t1=d((*nxt).h,c[i].h))<(t3=d((*pre).h,c[i].h))) {
			f[i][0][0]=(*nxt).id,db[i][0][0]=t1;
			if((t2=d((*nxtt).h,c[i].h))<d((*pre).h,c[i].h)) 
			    f[i][0][1]=(*nxtt).id,da[i][0][1]=t2;
			else f[i][0][1]=(*pre).id,da[i][0][1]=t3;
		} else {
			f[i][0][0]=(*pre).id,db[i][0][0]=t3;
			if((t2=d((*pree).h,c[i].h))<d((*nxt).h,c[i].h))
			    f[i][0][1]=(*pree).id,da[i][0][1]=t2;
			else f[i][0][1]=(*nxt).id,da[i][0][1]=t1;
		}
        if(f[i][0][0]==-1) db[i][0][0]=0;
        if(f[i][0][1]==-1) da[i][0][1]=0;
 	}
	for(int i=1; i<=n; i++) 
	    f[i][1][1]=f[f[i][0][1]][0][0],
	    db[i][1][1]=db[f[i][0][1]][0][0],da[i][1][1]=da[i][0][1];
	for(int k=2; k<21; k++)
	    for(int i=1; i<=n; i++) 
	        f[i][k][1]=f[f[i][k-1][1]][k-1][1],
	        db[i][k][1]=db[i][k-1][1]+db[f[i][k-1][1]][k-1][1],
	        da[i][k][1]=da[i][k-1][1]+da[f[i][k-1][1]][k-1][1];
	cin>>x0;
	for(int i=1; i<=n; i++) {
		node res=solve(i,x0);
		double ns=(res.h?(double)res.id/(double)res.h:1.0*INF); 
	    if(bis-ns>0) bis=ns,his=c[i].h,ansid=i;
	    else if(fabs(ns-bis)<1e-6&&c[i].h>his) his=c[i].h,ansid=i;
	}
	cout<<ansid<<endl;
	cin>>m;
	for(int i=1; i<=m; i++) {
		int si,xi;
		cin>>si>>xi;
		node otpt=solve(si,xi);
		cout<<otpt.id<<" "<<otpt.h<<endl;
	}
	return 0;
}

2021/11/24 23:13
加载中...