【問題描述】
乙個序列被稱為有趣的序列是它的所有的子串擁有乙個唯一的整數(這個整數在整個序
列中只出現過一次)。
給你乙個序列的整數, 問你它是否是有趣的。
【輸入格式】
第一行 t, 表示資料組數。
接下來每組資料第一行乙個 n。
接下來是 n 個整數, 均小於 10^9。
【輸出格式】
輸出 boring 或者 non-boring。
【輸入樣例】
451【輸出樣例】2 3 4 551
1 1 1 151
2 3 2 151
1 2 1 1
non-boring【資料範圍與約定】boring
non-boring
boring
對於 30%的資料: n<=10。
對於 100%的資料: n <= 200000, 每個整數小於 10^9。
ps: 子串為乙個連續的區間。
下面的題解是ppt裡的官方題解
100分:然後下面是自己的話:優秀的暴力。
對於乙個a[i],前一次出現記為pre[i],後一次出現記為nex[i]。
那左端點l在pre[i]+1..i,右端點在i..nex[i]-1都是合法的。
如果判定乙個區間[l,r],a[i]是其中唯一出現過的數字。
那這個區間就可以切割成判定2個區間[l,i - 1],[i + 1, r]。
那對於乙個區間[l,r],i,j同時從左邊和右邊開始掃,碰到第乙個唯一出現的數字就切割。直到l>=r。
這種做法看起來很像暴力,但實際上跑得飛快。
時間複雜度證明:
t(n) = t(k) + t(n-k)+min(n, n - k)。
一種直觀的想法就是,每次複雜度都是較小的那個區間。
倒過來看相當於較小的合併到較大的。那就是啟發式合併。
o(nlogn)。
昨天小奇的糖果
裡我好像說過遇到這種有不同顏色的東西經常把相同顏色的用雙向鍊錶串起來,結果早上模擬考時還是沒有這樣操作(只寫了30分暴力)
早上的暴力程式還因為 boring 打成了 borning 結果30分都沒拿到(!) 失望~~ (下次一定要注意)
直接貼**好了
1 #include2 #include3 #include4 #include5 #include67#define for(i,a,b) for(register int i=a;i<=b;++i)
8#define dwn(i,a,b) for(register int i=a;i>=b;--i)
9#define re register
1011
using
namespace
std;
1213
const
int n=2e5+10;14
intld[n],rd[n],a[n],lst[n];
15struct
lislis[n];
18int
n,m,x,y;
19 inline void read(int &v)
23while(c>='
0'&&c<='9')
24if(fg)v=-v;25}
26bool cmp(const lis &a,const lis&b)
2930
bool trial(int l,int
r)44
45 pl++;
46if(pl>pr)break
;47 fail=0;48
if(ld[pr]ppr)
54 pr--;
55if(pl>pr)break;56
57}
58if(fail)return0;
59else
return1;
60}6162
intmain()
81 for(i,1
,n)88
if(trial(1
,n))else93}
94fclose(stdin); fclose(stdout);
95return0;
96 }
NOIP模擬 序列操作
2017.11.06t2 好氣,我這道題寫的權值線段樹,結果維護的時候搞忘清零了,只有 20 分,加上清零就 a了,當然我是指的評測機上ac,在 oj 上要 t 一些點,有點小氣。我用權值線段樹,在修改的時候加了乙個 lo g2h 但我的詢問是 lo g2h 的,比較已經過了的 修改是 o h 詢問...
NOIP模擬題 括號序列
題目描述 課堂上,felix 剛剛學習了關於括號序列的知識。括號序列是乙個只由左括號 和右括號 構成的序列 進一步的,乙個合法的括號序列是指左括號和右括號能 夠 一一匹配的序列。如果用規範的語言說明,乙個合法的括號序列可以有以下三種形式 1 s 空串 s 是乙個合法的括號序列 2 s xy,其中 x...
NOIP模擬題 子串行
描述 給定3個字串,求它們的最長公共子串行。輸入 第一行乙個整數n,表示三個字串的長度 接下來三行,每行是乙個長度為n只包含小寫字母的字串。輸出 輸出最長公共子串行的長度。輸入樣例 4abac abbc cbca 輸出樣例 2提示 30 n 10 100 n 120 三維dp,道理和兩個字串的lcs...