COJ0985 WZJ的資料結構(負十五)

2022-05-09 18:43:58 字數 1564 閱讀 4075

[coj0985]wzj的資料結構(負十五)

試題描述

chx有乙個問題想問問大家。給你乙個長度為n的數列a,請你找到兩個位置l,r,使得a[l]、a[l+1]、……、a[r]中沒有重複的數,輸出r-l+1的最大值。

以上是附中聯賽加試的一道題。wzj覺得這道題太水了,改了改題目:

wzj有乙個問題想問問大家。給你乙個長度為n的數列a,你要回答m次問題。每次問題給你兩個正整數ql,qr。請你找到兩個位置l、r (ql<=l<=r<=qr),使得a[l]、a[l+1]、……、a[r]中沒有重複的數,輸出r-l+1的最大值。

輸入

輸入第一行為兩個正整數n,m。

輸入第二行為n個整數ai。

接下來m行每行兩個正整數ql,qr。

輸出

對於每個問題,輸出r-l+1的最大值。

輸入示例

531

2134

1324

25

輸出示例

2

34

資料規模及約定

1<=n<=200000

1<=m<=500000

1<=ql,qr<=n

-10^9<=ai<=10^9

題解

找出所有數上一次出現在哪(即對於乙個數 a[i],找到乙個最大的 pos 使得 a[pos] = a[i] 且 pos < i),然後計算出 f[i] 表示區間 [f[i], i] 沒有重複元素,且使得 f[i] 盡量小。那麼我們對於每個位置記錄 i - f[i] + 1,即最長區間長度,那麼對於詢問 [ql, qr],找到 [ql, k] 沒有重複元素且 k ≤ qr 的這個 k,然後 k 右邊部分求乙個最大值,左邊直接減。

#include #include #include #include #include #include #include #include #include #include #include using namespace std;

const int buffersize = 1 << 16;

char buffer[buffersize], *head, *tail;

inline char getchar()

return *head++;

}int read()

while(isdigit(c))

return x * f;

}#define maxn 200010

#define maxlog 20

int n, q, a[maxn], num[maxn], lp[maxn], f[maxn];

int log[maxn], mx[maxlog][maxn];

void init()

int main()

init();

while(q--)

return 0;

}

COJ1013 WZJ的資料結構(十三)

這道題有這樣乙個解法 首先把邊依次加到圖中,若當前這條邊與圖中的邊形成了環,那麼把這個環中最早加進來的邊彈出去 並將每條邊把哪條邊彈了出去記錄下來 ntr i j,特別地,要是沒有彈出邊,ntr i 0 這個顯然是可以用lct來弄的對吧。然後對於每個詢問,我們的答案就是對l r中ntr小於l的邊求和...

COJ0989 WZJ的資料結構(負十一)

coj0989 wzj的資料結構 負十一 試題描述 給出以下定義 1.若子串行 l,r 的極差 最大值 最小值 m,則子串行 l,r 為乙個均勻序列。2.均勻序列 l,r 的權值為sum l,r 即序列的元素和。現在給你乙個長度為n的整數序列a,請你求出權值前k大的均勻序列,輸出k行為它們的權值。輸...

COJ 1003 WZJ的資料結構(三)ST表

wzj的資料結構 三 難度級別 b 執行時間限制 3000ms 執行空間限制 51200kb 長度限制 2000000b 試題描述 請你設計乙個資料結構,完成以下功能 給定乙個大小為n的整數組a,m次詢問。每次詢問給你i,j兩個引數,求ai至aj中最大的數。輸入第一行為兩個正整數n,m。第二行為n個...