該題給一個序列,讓我們判斷是不是不無聊序列(如果不明白請看樣例), 我們可以將區間從大到小不斷壓縮來確定答案,首先要確定一個區間是否滿足要求,只要看這個區間里是不是有一個只出現一次的數,受前面《唯一的雪花》一題的啟發,我們可以在O(n)時間內求出當前數離他最近的與他相同的數的位置,用數組保存,那么可以在O(1)的時間快速判斷,這樣就將時間復雜度降到O(n^2) 但是這樣還是不夠的,會超時。?
紫書上給出了一個很巧妙的方法,那就是在遞歸的時候折半枚舉 ? , 時間復雜度變成了 T(n) = 2*T(n/2) + O(n) ?。 讓我們變一下形式,T(n)/n = T(n/2)/(n/2) + 2; ?令T(n)/n = C(n);
則C(n) - C(n/2) = 2; 令n = 2^k; ? 則令k = 1,2,3..... ?然后累加就得到 C(2^k) = C(1) + 2*k ? ,所以C(n) = C(1)+ 2*logn ? ?(以2為底) 所以時間復雜度是n*logn
這個公式叫主定理,大家可以自己查閱。
~~~
#include<bits/stdc++.h>
using namespace std;
const int maxn = 200000+5;
int T,n,a[maxn],pre[maxn],nex[maxn];
map<int,int> cur ;
bool is_unique(int p,int l,int r){
return pre[p]<l&&nex[p]>r;
}
bool check(int l,int r){
if(l>=r) return true;
for(int i=l;i-l<=r-i;i++){ //折半遞歸
if(is_unique(i,l,r)){
return check(i+1,r)&&check(l,i-1);
}
if(is_unique(r-i+l,l,r))
return check(r-i+l+1,r)&&check(l,r-i+l-1);
}
return false;
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&a[i]);
cur.clear();
for(int i=0;i<n;i++){
if(!cur.count(a[i])) pre[i] = -1;
else pre[i] = cur[a[i]];
cur[a[i]] = i;
}
cur.clear();
for(int i=n-1;i>=0;i--){
if(!cur.count(a[i])) nex[i] = n;
else nex[i] = cur[a[i]];
cur[a[i]] = i;
}
if(check(0,n-1)) printf("non-boring\n");
else printf("boring\n");
}
return 0;
}
~~~
- 前言
- 1608 - Non-boring sequences(折半遞歸。。暫且這么叫吧)
- 11491 - Erasing and Winning(貪心)
- 1619 - Feel Good(高效算法-利用數據結構優化-優先隊列)
- hdu-4127 Flood-it!(IDA*算法)
- UESTC 1132 醬神賞花 (用數據結構優化DP)
- HDU 2874 Connections between cities(LCA離線算法)
- Codeforces Round #317 A. Lengthening Sticks(組合+容斥)
- HDU 3085 Nightmare Ⅱ(雙向BFS)
- HDU 5592 ZYB&#39;s Premutation(二分+樹狀數組)
- Codeforces Round #320 (Div. 1) C. Weakness and Poorness(三分)
- HDU 5212 Code(容斥)
- HDU 5596 GTW likes gt(multiset)
- FZU 2159 WuYou(貪心)
- HDU 3450 Counting Sequences(DP + 樹狀數組)
- HDU 5493 Queue(二分+樹狀數組)
- HDU 1166 敵兵布陣(線段樹版)
- HDU 1394 Minimum Inversion Number(樹狀數組||線段樹)
- HDU 2795 Billboard(線段樹)
- POJ 2828 Buy Tickets(樹狀數組)
- 《完全版線段樹》- NotOnlySuccess
- POJ 2886 Who Gets the Most Candies?(樹狀數組+二分)
- HDU 1698 Just a Hook(線段樹區間修改)
- POJ 3468 A Simple Problem with Integers(線段樹|區間加減&amp;&amp;區間求和)
- POJ 2528 Mayor&#39;s posters(線段樹區間修改+離散化)
- HDU 5606 tree(并查集)
- POJ 3734 Blocks(矩陣優化+DP)
- POJ 3233 Matrix Power Series(矩陣優化)
- HDU 5607 graph(矩陣優化+概率DP)
- POJ 2777 Count Color(線段樹區間修改+位運算)
- POJ 1436 Horizontally Visible Segments(線段樹區間修改)
- UVA 1513 - Movie collection(樹狀數組)
- UVA 1232 - SKYLINE(線段樹區間更新)
- 11525 - Permutation(二分+樹狀數組)
- 11402 - Ahoy, Pirates!(線段樹區間更新(標記重疊的處理))
- Educational Codeforces Round 6 E. New Year Tree(DFS序+線段樹)