1301 鄰值查詢(set 平衡樹 鍊錶)

2022-08-01 04:06:13 字數 1422 閱讀 7079

描述

給定乙個長度為 n 的序列 a,a 中的數各不相同。對於 a 中的每乙個數 a_i,求:

min(1≤j輸入格式

第一行乙個整數n,第二行n個數a_1~a_n。

輸出格式

n-1行,每行2個用空格隔開的整數。分別表示當i取2~n時,對應的 min(1≤j樣例輸入

3

1 5 3

樣例輸出
4 1

2 1

資料範圍與約定

思路:對於乙個數,我們需要對出現在它前面的數進行排序,然後找到有序序列中該數應當排在的位置,那麼他的前驅和後繼就是離他最近的點,比較一下就可以輸出。

可以用set(平衡樹),自帶排序進行排序,或者用鍊錶。o(nlogn)

set:

#includeusing

namespace

std;

struct

node

bool

operator

};set

s;int

main()

else

if(r ==s.begin())

else

if(x-l->x <= r->x -x)

else

printf(

"%d %d\n

",r->x-x,r->index);

s.insert(node(x,i));}}

view code

鍊錶:先讀入資料,然後排序,記錄下原資料位置i的資料在排序後處於何處(用p【i】表示),那麼在排序陣列中pre和next就是離該數最近的數

,從怕p【n】到p處理(因為這樣該數永遠是剩下的數在原陣列中下標最大的),處理完後將該數刪除。o(nlogn)

#includeusing

namespace

std;

struct

node

node[

100005

];int p[100005

];int

n;bool

cmp(node a,node b)

int ans1[100005

];int ans2[100005

];int

main()

sort(node+1,node+1+n,cmp);

for(int i=1;i<=n;i++)

node[

1].pre = node[n].next = -1

;

for(int i=1;i<=n;i++)

for(int i=n;i>=2;i--)

if(node[p[i]].next != -1

)

}for(int i=2;i<=n;i++)

}

view code

鄰值查詢CH1301(平衡樹)

給定乙個長度為 n 的序列 a,a 中的數各不相同。對於 a 中的每乙個數 a i 求 m i n 1 j i a i a j 以及令上式取到最小值的 j 記為 p i 若最小值點不唯一,則選擇使 a j 較小的那個。資料範圍 n 105 ai 109 題解 可以借助set來實現,set的查詢是o ...

CH1301 鄰值查詢

給定乙個長度為 n 的序列 a,a 中的數各不相同。對於 a 中的每乙個數 a ia i ai 求 m in 1 j ai aj min 1 jmi n 1 j ai aj 以及令上式取到最小值的 j 記為 p ip i pi 若最小值點不唯一,則選擇使 a ja j aj 較小的那個。題解 可以借...

演算法競賽高階指南 CH1301鄰值查詢(set)

題目描述 給定乙個長度為 n 的序列 a,a 中的數各不相同。對於 a 中的每乙個數 ai,求 min1 j輸入格式 第一行輸入整數n,代表序列長度。第二行輸入n個整數a1 an,代表序列的具體數值,數值之間用空格隔開。輸出格式 輸出共n 1行,每行輸出兩個整數,數值之間用空格隔開。分別表示當i取2...