BZOJ 4059: [Cerc2012]Non-boring sequences ( )
要快速在一段子序列中判斷一個元素是否只出現一次 , 我們可以預處理出每個元素左邊和右邊最近的相同元素的位置 , 這樣就可以 O( 1 ) 判斷.
考慮一段序列 [ l , r ] , 假如我們找到了序列中唯一元素的位置 p , 那我們只需檢查 [ l , p - 1 ] & [ p + 1 , r ] 是否 non-boring 即可 .?
如何檢查 序列 [ l , r ] 呢 ? 假如從左往右或者從右往左找 , 最壞情況下是 O( n ) , 總時間復雜度會變成 O( n2 ) ; 假如我們從兩邊往中間找 , 那最壞情況是唯一元素在中間 , ?單次是 O( n ) , 但是現在劃分出來的遞歸處理的左右兩部分都是原序列長度的一半 , 這樣總時間復雜度就是 O( nlogn ) 了
------------------------------------------------------------------------------------------------------
#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<map>#define rep( i , n ) for( int i = 0 ; i < n ; ++i )#define clr( x , c ) memset( x , c , sizeof( x ) )using namespace std;const int maxn = 200000 + 5;int seq[ maxn ] , L[ maxn ] , R[ maxn ] , n;map< int , int > S;#define UNIQUE( x ) ( L[ x ] < l && R[ x ] > r )bool check( int l , int r ) {if( l >= r ) return true;int t[ 2 ] = { l , r };for( int p = 0 ; t[ 0 ] <= t[ 1 ] ; ( p ^= 1 ) ? t[ 0 ]++ : t[ 1 ]-- )if( UNIQUE( t[ p ] ) ) ? ?return check( l , t[ p ] - 1 ?) && check( t[ p ] + 1 , r );return false;}int main() {freopen( "test.in" , "r" , stdin );int t;cin >> t;while( t-- ) {scanf( "%d" , &n );rep( i , n )L[ i ] = -1 , R[ i ] = n;S.clear();rep( i , n ) { ? ?scanf( "%d" , seq + i ); ? ?if( S.find( seq[ i ] ) != S.end() ) ? ? ? ?L[ i ] = S[ seq[ i ] ]; ? ?S[ seq[ i ] ] = i;}S.clear();for( int i = n - 1 ; i >= 0 ; i-- ) { ? ?if( S.find( seq[ i ] ) != S.end() )R[ i ] = S[ seq[ i ] ]; ? ?S[ seq[ i ] ] = i;}printf( check( 0 , n - 1 ) ? "non-boring\n" : "boring\n" );}return 0;}?
------------------------------------------------------------------------------------------------------?
?
4059: [Cerc2012]Non-boring sequences
Time Limit:?10 Sec??Memory Limit:?128 MBSubmit:?300??Solved:?105
[Submit][Status][Discuss]
Description
我們害怕把這道題題面搞得太無聊了,所以我們決定讓這題超短。一個序列被稱為是不無聊的,僅當它的每個連續子序列存在一個獨一無二的數字,即每個子序列里至少存在一個數字只出現一次。給定一個整數序列,請你判斷它是不是不無聊的。
Input
第一行一個正整數T,表示有T組數據。每組數據第一行一個正整數n,表示序列的長度,1 <= n <= 200000。接下來一行n個不超過10^9的非負整數,表示這個序列。
Output
對于每組數據輸出一行,輸出"non-boring"表示這個序列不無聊,輸出"boring"表示這個序列無聊。
Sample Input
45
1 2 3 4 5
5
1 1 1 1 1
5
1 2 3 2 1
5
1 1 2 1 1
Sample Output
non-boringboring
non-boring
boring
HINT
Source
鳴謝Tjz
?
轉載于:https://www.cnblogs.com/JSZX11556/p/4632774.html
總結
以上是生活随笔為你收集整理的BZOJ 4059: [Cerc2012]Non-boring sequences ( )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 整形双眼皮多少钱啊?
- 下一篇: Linux访问Windows磁盘实现共享