已经调了5个多小时了,还是0分
查看原帖
已经调了5个多小时了,还是0分
1046620
qcf2010楼主2025/7/21 20:02

大佬能帮忙看看吗?

#include<bits/stdc++.h>
#define ll long long
using namespace std;

int n;
ll a[100010],b[100010];
pair<ll,int> ans[100010];

struct Node{
	ll val;
	int prev,next;
}node[100010];
int head,tail,tot;

void Intialize(){
	tot=2;
	head=1;
	tail=2;
	node[head].next=tail;
	node[tail].prev=head;
	node[head].val=-1e10;
	node[tail].val=1e10;
}

void Insert(int p,ll value){
	node[++tot].val=value;
	node[node[p].next].prev=tot;
	node[tot].next=node[p].next;
	node[p].next=tot;
	node[tot].prev=p;
}

void Remove(int p){
	node[node[p].prev].next=node[p].next;
	node[node[p].next].prev=node[p].prev;
}

int Found(ll x){
	int l=1,r=n;
	while(l<r){
		int mid=(l+r)>>1;
		if(a[mid]>=x) r=mid;
		else l=mid+1;
	}
	return l;
}

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	
	Intialize();
	cin>>n;
	for(int i=1;i<=n;++i){
		cin>>a[i];
		b[i]=a[i];
	}
	sort(a+1,a+n+1);
	for(int i=1;i<=n;++i) Insert((i==1?1:i+1),a[i]);
	
	for(int i=n;i>=2;--i){
		int idx=Found(b[i])+2;
		ll now=node[idx].val;
		ll p=node[node[idx].prev].val;
		ll q=node[node[idx].next].val;
		if(now-p<=q-now){
			ans[i].first=now-p;
			ans[i].second=Found(p);
		}else{
			ans[i].first=q-now;
			ans[i].second=Found(q);
		}
		Remove(idx);		
	}
	 
	for(int i=2;i<=n;++i) cout<<ans[i].first<<" "<<ans[i].second<<"\n";

	return 0;
}

2025/7/21 20:02
加载中...