DTOJ3308 從今以後

2021-10-05 01:55:59 字數 2236 閱讀 2532

資料範圍與提示

題解小果有乙個數列

定義這個數列是合法的,指對於這個數列的每個子串行,都存在乙個元素在在這個子串行中,只出現了一次

請幫小果判斷這個數列是否合法

第一行乙個整數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...