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
- 素數推斷演算法(高效率)演算法
- D. Invertible Bracket SequencesRacket
- Codeforces 264B. Good SequencesGo
- python實現高效率的排列組合演算法Python演算法
- [ABC292G] Count Strictly Increasing Sequences
- OGG Installing support for Oracle sequencesOracle
- ABC 312D題 Count Bracket SequencesRacket
- 淺談Kotlin中的Sequences原始碼解析(十)Kotlin原始碼
- Codeforces 900D Unusual Sequences:記憶化搜尋
- 題解:AT_abc367_c [ABC367C] Enumerate Sequences
- 高效率Oracle SQL語句OracleSQL
- 翻譯:《實用的Python程式設計》02_04_SequencesPython程式設計
- [譯]Kotlin中是應該使用序列(Sequences)還是集合(Lists)?Kotlin
- 提高效率的總結
- php 高效率寫法 推薦PHP
- 一個人如何提高效率
- 高效率爬蟲框架之 pyspider爬蟲框架IDE
- Rust高效率非同步I/O模型Rust非同步模型
- 提高效率的13個策略
- [20181007]Scalable sequences oracle database 12c.txtOracleDatabase
- oracle 11.2.0.4 sequence之dba_sequences last_number含義測試之一OracleAST
- 高效率使用隧道轉發爬蟲代理爬蟲
- 新版 C# 高效率程式設計指南C#程式設計
- 高效率JAVA實現斐波那契Java
- 讓你提高效率的Linux技巧Linux
- 讓你提高效率的 Linux 技巧Linux
- 48 條高效率的 PHP 優化寫法PHP優化
- 10個提高效率的Chrome外掛Chrome
- Type Traits 例項,提高效率 (轉)AI
- 代理伺服器IP提高效率的方法伺服器
- 如何高效率刪除大表歷史資料
- 分享5款高效率軟體,免費無廣告
- 提高效率,推薦 5 款命令列工具命令列
- Java讀取大檔案的高效率實現Java
- 7個提高效率的JavaScript除錯工具JavaScript除錯
- 8個提高效率的CSS實用工具CSS
- 百萬資料如何高效率匯入資料庫資料庫