1. 程式人生 > >bzoj4059 [Cerc2012]Non-boring sequences

bzoj4059 [Cerc2012]Non-boring sequences

分治 過程 == break 掃描線 sequence 合並 algo 檢驗

根本不會。。。

似乎有很高妙的分治做法啊!https://www.cnblogs.com/forever97/p/bzoj4059.html

就是說,如果當前區間為[l,r],有一個i滿足pre[i]<l&&nxt[i]>r,那麽任意一個包含i點的區間都不無聊,因此只需要再檢驗[l,i-1]和[i+1,r]即可

復雜度就是因為倒過來就是啟發式合並的過程。。。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<vector>
 5
#include<map> 6 using namespace std; 7 #define fi first 8 #define se second 9 #define mp make_pair 10 #define pb push_back 11 typedef long long ll; 12 typedef unsigned long long ull; 13 typedef pair<int,int> pii; 14 int n,T,a[200100]; 15 int pre[200100],nxt[200100]; 16 map<int,int> ma;
17 bool solve(int l,int r) 18 { 19 if(l>=r) return 1; 20 int i,j; 21 for(i=l,j=r;;) 22 { 23 if(i==j) break; 24 i++; 25 if(pre[i]<l&&nxt[i]>r) return solve(l,i-1)&&solve(i+1,r); 26 if(i==j) break; 27 j--;
28 if(pre[j]<l&&nxt[j]>r) return solve(l,j-1)&&solve(j+1,r); 29 } 30 return 0; 31 } 32 int main() 33 { 34 int i; 35 scanf("%d",&T); 36 while(T--) 37 { 38 scanf("%d",&n); 39 for(i=1;i<=n;i++) scanf("%d",&a[i]); 40 ma.clear(); 41 for(i=1;i<=n;i++) 42 { 43 pre[i]=ma.count(a[i])?ma[a[i]]:0; 44 ma[a[i]]=i; 45 } 46 ma.clear(); 47 for(i=n;i>=1;i--) 48 { 49 nxt[i]=ma.count(a[i])?ma[a[i]]:n+1; 50 ma[a[i]]=i; 51 } 52 puts(solve(1,n)?"non-boring":"boring"); 53 } 54 return 0; 55 }

也有很高妙的掃描線做法啊!https://blog.csdn.net/PoPoQQQ/article/details/46380617

bzoj4059 [Cerc2012]Non-boring sequences