51nod 1571 最近等對 線段樹 離線

2022-03-30 06:04:32 字數 1426 閱讀 2339

現在有乙個序列 a1, a2, ..., an ,還有m個查詢 lj, rj (1 ≤ lj ≤ rj ≤ n) 。對於每乙個查詢,請找出距離最近的兩個元素 ax 和 ay (x ≠ y) ,並且滿足以下條件:

· lj ≤ x, y ≤ rj;

· ax = ay。

兩個數字的距離是他們下標之差的絕對值 |x − y| 。

單組測試資料。

第一行有兩個整數n, m (1≤n,m≤5*10^5),表示序列的長度和查詢的次數。

第二行有n個整數a1,a2,...,an (-109≤ai≤109)。

接下來有m行,每一行給出兩個整數lj,rj (1≤lj≤rj≤n)表示乙個查詢。

對於每乙個查詢,輸出最近的距離,如果沒有相等的元素,輸出-1。

樣例輸入1

5 31 1 2 3 2

1 52 4

3 5樣例輸出11-1

2離線之後,從左向右掃一遍,讓每個值儲存「當前已掃過的部分中,右邊第乙個與自己相等的點到自己的距離」,然後如果當前掃到的點是詢問的右端點的話,就回答這個詢問。

#include #include #include #define inf 0x3f3f3f3f

#define space putchar(' ')

#define enter putchar('\n')

using namespace std;

typedef long long ll;

template bool read(t &x)

template void write(t x)

const int n = 500005;

int n, m, q, a[n], s[n], last[n], left[n], data[4*n], ans[n];

struct query

} q[n];

void build(int k, int l, int r)

void change(int k, int l, int r, int p, int x)

int query(int k, int l, int r, int ql, int qr)

int main()

build(1, 1, n);

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

q[i].id = i, read(q[i].l), read(q[i].r);

sort(q + 1, q + q + 1);

for(int i = 1, j = 1; i <= n && j <= q; i++)

}for(int i = 1; i <= q; i++)

write(ans[i] < inf ? ans[i] : -1), enter;

return 0;

}

51nod 1571 最近等對 CQD分治

現在有乙個序列 a1,a2,ana1,a2,an 還有m個查詢 lj,rj 1 lj rj n lj,rj 1 lj rj n 對於每乙個查詢,請找出距離最近的兩個元素 axax 和 ay x y ay x y 並且滿足以下條件 lj x,y rj lj x,y rj ax ay。ax ay。兩個數...

51Nod1779 逆序對統計

lyk最近計畫按順序做n道題目,每道題目都分為很多分數檔次,lyk覺得這些題太簡單了,於是它想到了乙個好玩的遊戲。lyk決定將每道題目做出其中的某個分數,使得這n道題目的逆序對個數最多。為了方便,假設共有m個分數檔次,並且會給m個分數檔次分配乙個題目編號,表示該題目會出現這個分數檔次。題目保證每道題...

51NOD1779 逆序對統計

lyk最近計畫按順序做n道題目,每道題目都分為很多分數檔次,lyk覺得這些題太簡單了,於是它想到了乙個好玩的遊戲。lyk決定將每道題目做出其中的某個分數,使得這n道題目的逆序對個數最多。為了方便,假設共有m個分數檔次,並且會給m個分數檔次分配乙個題目編號,表示該題目會出現這個分數檔次。題目保證每道題...