描述
給定乙個長度為 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:
#includeusingview codenamespace
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));}}
鍊錶:先讀入資料,然後排序,記錄下原資料位置i的資料在排序後處於何處(用p【i】表示),那麼在排序陣列中pre和next就是離該數最近的數
,從怕p【n】到p處理(因為這樣該數永遠是剩下的數在原陣列中下標最大的),處理完後將該數刪除。o(nlogn)
#includeusingview codenamespace
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++)
}
鄰值查詢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...