Uva-1608 Non-boring sequences(高效率演算法)
題意:如果一個序列的任意連續子序列中至少有一個只出現一次的元素,則稱這個序列是不無聊的.輸入一個n(n <= 200000)個元素的序列A,判斷它是不是無聊的.
分析:對一段序列[l,r]而言,我們先找到這整個序列中只出現了一次的元素,如果沒有那麼就可以直接返回false,假如我們得到了這個元素p,那麼接下來只需要遞迴的去檢查區間[l,p-1]和
[p+1,r]就行了,我們事先預處理出來每個元素前後最近相同元素的位置就可以o(1)的判斷這個數字是不是在某個子序列中只出現了一次,這樣我們可以掃一遍[l,r]來得到p.
設T(n)為規模為n時所需的時間,那麼T(n) = max(T(p-1) + T(n-p) + O(n)),最壞情況下T(n) = O(n^2).但是如果我們從兩邊開始同步找p,複雜度就變成了T(n) = max(T(p-1)+T(n-p)+min(p,n-p)),最壞情況下每次p都在[l,r]中點,此時T(n) = 2*T(n/2) + O(n) = O(n*log(n)).
#include <bits/stdc++.h>
#define N 200005
using namespace std;
int T,n,a[N],pre[N],suc[N];
unordered_map<int,int> f;
bool jud(int l,int r)
{
if(l >= r) return true;
int flag = 0;
int x = l,y = r;
while(x <= y)
{
if(pre[x] < l && (!suc[x] || suc[x] > r))
{
flag = x;
break;
}
if(pre[y] < l && (!suc[y] || suc[y] > r))
{
flag = y;
break;
}
x++,y--;
}
if(!flag) return false;
return jud(l,flag-1)&&jud(flag+1,r);
}
int main()
{
scanf("%d",&T);
while(T--)
{
f.clear();
scanf("%d",&n);
for(int i = 1;i <= n;i++) scanf("%d",&a[i]);
for(int i = 1;i <= n;i++)
{
pre[i] = f[a[i]];
f[a[i]] = i;
}
f.clear();
for(int i = n;i;i--)
{
suc[i] = f[a[i]];
f[a[i]] = i;
}
cout<<(jud(1,n) ? "non-boring" : "boring")<<endl;
}
}
相關文章
- Bracket Sequences IIRacket
- 013 Three Div Sequences
- D. Invertible Bracket SequencesRacket
- Codeforces 264B. Good SequencesGo
- ARC100D/F Colorful Sequences
- [ABC292G] Count Strictly Increasing Sequences
- ABC 312D題 Count Bracket SequencesRacket
- [20181007]Scalable sequences oracle database 12c.txtOracleDatabase
- 淺談Kotlin中的Sequences原始碼解析(十)Kotlin原始碼
- 題解:AT_abc367_c [ABC367C] Enumerate Sequences
- cf900D. Unusual Sequences(容斥 莫比烏斯反演)
- [譯]Kotlin中是應該使用序列(Sequences)還是集合(Lists)?Kotlin
- 翻譯:《實用的Python程式設計》02_04_SequencesPython程式設計
- 高效率爬蟲框架之 pyspider爬蟲框架IDE
- 提高效率的總結
- 一個人如何提高效率
- 共享辦公室,高效率創業創業
- 讓你提高效率的Linux技巧Linux
- 讓你提高效率的 Linux 技巧Linux
- 新版 C# 高效率程式設計指南C#程式設計
- 高效率使用隧道轉發爬蟲代理爬蟲
- 轉自 陳皓 部落格 《提高效率》
- 48 條高效率的 PHP 優化寫法PHP優化
- 5 個提高效率的 GNOME 快捷鍵
- 提高效率的 Android Studio 技巧彙總Android
- 如何高效率刪除大表歷史資料
- 代理伺服器IP提高效率的方法伺服器
- 分享5款高效率軟體,免費無廣告
- 五大高效率的DevOps工具,運維必收!dev運維
- 如何通過精益流程改進提高效率?
- 如何"有計劃,高效率,優簡歷"應對面試面試
- 五款高效率黑科技神器工具,炸裂好用,省時間
- 如何選擇高效率的網路安全技術團隊?
- 【SQL】Oracle 表新增列提高效率語句參考SQLOracle
- 高效率的專案管理軟體應具備的功能專案管理
- 在實際例子中學習正規表示式(高效率)
- 專案管理軟體最佳化流程提高效率專案管理
- 小技巧:SpringBoot專案如何讓前端開發提高效率?Spring Boot前端
- 前端工程師如何與設計師合作能提高效率前端工程師