bzoj4059 [Cerc2012]Non-boring sequences
Posted hehe54321
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj4059 [Cerc2012]Non-boring sequences相关的知识,希望对你有一定的参考价值。
根本不会。。。
似乎有很高妙的分治做法啊!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的主要内容,如果未能解决你的问题,请参考以下文章
bzoj4059 [Cerc2012]Non-boring sequences
BZOJ 4059 [Cerc2012]Non-boring sequences(启发式分治)