码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj4059 [Cerc2012]Non-boring sequences

时间:2018-08-26 22:03:17      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:names   back   pre   algo   i+1   cer   .net   com   algorithm   

根本不会。。。

似乎有很高妙的分治做法啊!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

标签:names   back   pre   algo   i+1   cer   .net   com   algorithm   

原文地址:https://www.cnblogs.com/hehe54321/p/9538892.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!