1. 程式人生 > >uva1608 Non-boring sequences

uva1608 Non-boring sequences

nlogn break 序列 lse uva next 復雜度 pri span

某個序列找到唯一元素後,判斷被分成的兩邊的序列即可
問題在於找到唯一元素
連續序列,重復元素的問題;感覺很有一般性 查找相同元素用map,last,next存上一個相同元素的位置
復雜度計算有點思考;
記錄last,next,那麽對於一個元素,判斷是否獨立O(1)
從頭開始查找,最壞情況T(n)=T(n-1)+O(n)(O(n)是從頭判斷到尾) =O(n^2)
兩邊開始T(n)=2T(n/2)+O(n)=T(nlogn)

#include<cstdio>
#include<map>
using namespace std;

const int maxn = 200000 + 5;
int
A[maxn], last[maxn], nextp[maxn]; map<int, int> cur; bool duli(int p, int L, int R) { return last[p] < L && nextp[p] > R; } bool check(int L, int R) { if(L >= R) return true; for(int d = 0; L+d <= R-d; d++) { if(duli(L+d, L, R)) //L+d位置上的元素 獨立
return check(L, L+d-1) && check(L+d+1, R); if(L+d == R-d) break; if(duli(R-d, L, R)) return check(R-d+1, R) && check(L, R-d-1); } return false; } int main() { int T, n; scanf("%d", &T); while(T--) { scanf("%d", &n); cur.clear(); for
(int i = 0; i < n; i++) { scanf("%d", &A[i]); if(!cur.count(A[i])) last[i] = -1; else last[i] = cur[A[i]]; cur[A[i]] = i; } cur.clear(); for(int i = n-1; i >= 0; i--) { if(!cur.count(A[i])) nextp[i] = n; else nextp[i] = cur[A[i]]; cur[A[i]] = i; } if(check(0, n-1)) printf("non-boring\n"); else printf("boring\n"); } return 0; }

uva1608 Non-boring sequences