[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的最大值。
輸入示例
5312134
1324
25
輸出示例
234
資料規模及約定
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個...