95分 WA#4 求调
查看原帖
95分 WA#4 求调
766022
__pipi__楼主2024/8/6 15:24
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+5;
const int inf=0x3f3f3f3f3f3f3f3f;
ll n, tot, le, re, brr[N];

pair<ll, ll> arr[N], ans[N];

struct stu {
	ll id, val, pre, ne;
}q[N];

void bui() {
	tot = 2;
	le = 1;
	re = 2;
	q[le].ne = re;
	q[re].pre = le;
	q[le].val = inf;
	q[re].val = inf;
}

void add(ll p, ll id, ll val) {
	tot++;
	q[tot].id = id;
	q[tot].val = val;
	q[tot].ne = q[p].ne;
	q[q[p].ne].pre = tot;
	q[tot].pre = p;
	q[p].ne = tot;
}

void del(ll p) {
	q[q[p].pre].ne = q[p].ne;
	q[q[p].ne].pre = q[p].pre;
}

void clear() {
	memset(q, 0, sizeof(q));
	le = re = tot = 0;
}

bool cmp(pair<ll, ll> x, pair<ll, ll> y) {
	if(x.second == y.second) return x.first < y.first;
	return x.second < y.second;
} 

bool cmp2(pair<ll, ll> x, pair<ll, ll> y) {
	return x.first < y.first;
}
int main() {
	cin>>n;
	for(int i=1;i<=n;i++) {
		arr[i].first = i;
		cin>>arr[i].second;
	}
	bui();   
	sort(arr+1,arr+n+1,cmp);
	for(int i = 1; i <= n; i++) {
		if(i == 1) {
			add(le, arr[i].first, arr[i].second);		
		}
		else add(brr[arr[i-1].first], arr[i].first, arr[i].second);
		brr[arr[i].first]=tot;
	}
	sort(arr+1,arr+n+1,cmp2);
	for(int i = n; i >= 2; i--) {
		ll x = abs(arr[i].second - q[q[brr[i]].pre].val);
		ll y = abs(arr[i].second - q[q[brr[i]].ne].val);
		if(x<=y) {
			ans[i].first = x;
			ans[i].second = q[q[brr[i]].pre].id;
		}
		else {
			ans[i].first = y;
			ans[i].second = q[q[brr[i]].ne].id;
		}
		del(brr[i]);
	} 
	for(int i=2; i<=n; i++) {
		cout<<ans[i].first <<" "<< ans[i].second << endl;
	} 
	return 0;
}

2024/8/6 15:24
加载中...