資料範圍與提示
題解小果有乙個數列
定義這個數列是合法的,指對於這個數列的每個子串行,都存在乙個元素在在這個子串行中,只出現了一次
請幫小果判斷這個數列是否合法
第一行乙個整數t
tt,表示資料組數
接下來t
tt組資料,每組資料第一行有乙個整數n
nn,表示該組資料的序列長度,之後一行有n
nn個非負整數a
ia_i
ai,表示該序列中每個元素的值
共t
tt行,每行為yes
或者no
,表示這個序列合法或不合法
4
51 2 3 4 5
51 1 1 1 1
51 2 3 2 1
51 1 2 1 1
yes
noyes
no
對於30
%30\%
30%的資料∑n⩽
5000
\sum n \leqslant 5000
∑n⩽500
0對於100
%100\%
100%
的資料∑n⩽
2×10
6,n⩽
2×10
5\sum n \leqslant 2 \times 10^6,n \leqslant 2 \times 10^5
∑n⩽2×1
06,n
⩽2×1
05所有的a
ia_i
ai滿足0⩽a
i⩽10
90 \leqslant a_i \leqslant 10^9
0⩽ai⩽
109我的方法比較奇怪,如果你想看常規方法,可以看看這個神犇的部落格
首先,先離散化,沒啥好說的吧
接著,我們計算出pre
ipre_i
prei和nxt
inxt_i
nxti
分別表示前乙個值為a
ia_i
ai的位置的下標和後乙個值為a
ia_i
ai的位置的下標(也就是apr
ei=a
ia_=a_i
aprei
=ai
且∀j∈(
prei
,i),
aj≠a
i\forall j\in(pre_i,i),a_j\neq a_i
∀j∈(pr
ei,
i),a
j
=ai
,a nx
ti=a
ia_=a_i
anxti
=ai
且∀j∈(
i,nx
ti),
aj≠a
i\forall j\in(i,nxt_i),a_j\neq a_i
∀j∈(i,
nxti
),a
j
=ai
)所以,∀l∈
(pre
i,i]
,r∈[
i,nx
ti
)\forall l\in (pre_i,i],r\in[i,nxt_i)
∀l∈(pr
ei,
i],r
∈[i,
nxti
),區間[l,
r]
[l,r]
[l,r
]是合法的
所以,我們只需要找到這個區域內只出現一次的數,然後分別把數列從這個數劈成兩半,分別考慮兩個數列,如果都是合法的,那麼這個數列就是合法的,進行遞迴即可
附上**:
#include
#include
using
namespace std;
int n,a[
200010
],a[
200010
],pre[
200010
],nxt[
200010
],q[
200010
],h[
200010];
intdg
(int l,
int r)
return0;
}int
main()
}
考試總結 3 30
1.用什麼命令顯示當前目錄?echo 2.將當前目錄下的myftp.tar.gz解壓到 tmp下?tar xvzfmyftp.tar.gz c tmp 關於tar每列的補充 c解壓到指定目錄 c建立新的存檔 a與已有的存檔合併 d比較存檔與當前文件的不同之處 r附加到存檔結尾 f指定存檔或裝置 w每...
3 30 學習筆記
關閉鍵盤 self.num resginfirstresponder 讓試圖關閉見鍵盤 self.view enditing yes h 檔案 公有擴充套件 m檔案 私有擴充套件 中書寫私有的擴充套件 ibaction 本質上是乙個void 只不過多了乙個 連線 oc是乙個動態語言 編譯正確 但是 ...
java語言基礎 3 30
1 條件語句 if else if boolean expression statement1 else statement2 2 多分支語句 switch switch expression 表示式expression的返回值型別必須是這幾種型別之一 int,byte,char,short。cas...