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(启发式分治)

BZOJ 4059 (分治暴力|扫描线+线段树)

题解-bzoj4061 CERC-2012Farm and Factory

bzoj4059

BZOJ 4059 Non-boring sequences