好诡异的一个题啊

紫书上关于从左边找还是从两边往中间找的讨论没有看懂,怎么一下就找到唯一的元素了(⊙_⊙?)

方法就是用的书上讲的方法,类似于uva 11572,不过这个题需要预处理存下两边的最近的相同数的位置

for (int i=;i<=n;i++) {
prev[i]=r[a[i]];
next[prev[i]]=i;
r[a[i]]=i;}//记录元素a[i]上次出现的位置,因为是从左向右遍历,所以上次出现的位置正好是prev[i]要求的
//prev[i],与 i位置的元素 相同的左边最近的元素的位置
//next[i] 同理

然后递归检查是否符合题意就可以了。。。

从左边开始找

int dfs(int l,int r){
if (l>=r) return ;
int p;
for (p=l;p<=r;p++)
if (next[p]>r&&prev[p]<l) break;
if (p>r) return ;
return dfs(l,p-)&&dfs(p+,r);
}
//TLE的dfs,从左往右找的

TLE,然后改成从两边向中间开始找

int dfs(int l, int r) {
if(l >= r) return ;
for(int i = ; i <= (r-l+)/; i++) {
if(next[l+i] > r && prev[l+i] < l)
return dfs(l, l+i-) && dfs(l+i+, r);
if(next[r-i] > r && prev[r-i] < l)
return dfs(l, r-i-) && dfs(r-i+, r);
}
return ;
}

但是还是TLE,这下我就蛋疼了,想半天想不出来还能优化的地方

结果参考网上大神,对比了一下,发现他是用的map存的,避免了使用memset,但是换成了map.clear()(map.clear非常快么= =)

下面那条只是把map改成数组,然后只用了一句memset,看时间增加量

AC代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#define maxn 200000+5
using namespace std;
int prev[maxn],next[maxn];
int a[maxn];
map <int,int>r;
int n; /*
int dfs(int l,int r){
if (l>=r) return 1;
int p;
for (p=l;p<=r;p++)
if (next[p]>r&&prev[p]<l) break;
if (p>r) return 0;
return dfs(l,p-1)&&dfs(p+1,r);
} */
//TLE的dfs,从左往右找的 int dfs(int l, int r) {
if(l >= r) return ;
for(int i = ; i <= (r-l+)/; i++) {
if(next[l+i] > r && prev[l+i] < l)
return dfs(l, l+i-) && dfs(l+i+, r);
if(next[r-i] > r && prev[r-i] < l)
return dfs(l, r-i-) && dfs(r-i+, r);
}
return ;
} //二分的思想,从两边往中间找
int main()
{
int testcase;
scanf("%d",&testcase);
while (testcase--){
//memset(prev,0,sizeof(prev));
//memset(next,0,sizeof(next));
//memset(a,0,sizeof(a));
//memset(r,0,sizeof(r));
r.clear();
scanf("%d",&n);
for (int i=;i<=n;i++) {scanf("%d",&a[i]);prev[i]=;next[i]=n+;}
for (int i=;i<=n;i++) {
prev[i]=r[a[i]];
next[prev[i]]=i;
r[a[i]]=i;}//记录元素a[i]上次出现的位置,因为是从左向右遍历,所以上次出现的位置正好是prev[i]要求的
//prev[i],与 i位置的元素 相同的左边最近的元素的位置
//next[i] 同理
puts(dfs(, n) ? "non-boring" : "boring");
}
}

时间复杂度是o(nlogn)

以后对于大数据量的数组,还是尽量不要用memset这条语句了,虽然是线性的......

ps.本题代码有参考网上某大神的代码。我一开始写的代码比较丑,尤其是预处理那段,贴出来也没人看得懂= =,就不贴了。

UVa 1608,Non-boring sequences的更多相关文章

  1. uva 1608 不无聊的序列

    uva 1608 不无聊的序列 紫书上有这样一道题: 如果一个序列的任意连续子序列中都至少有一个只出现一次的元素,则称这个序列时不无聊的.输入一个n个元素的序列,判断它是不是无聊的序列.n<=2 ...

  2. UVA - 1608 Non-boring sequences (分治,中途相遇法)

    如果一个序列中是否存在一段连续子序列中的每个元素在该子序列中都出现了至少两次,那么这个序列是无聊的,反正则不无聊.给你一个长度为n(n<=200000)的序列,判断这个序列是否无聊. 稀里糊涂A ...

  3. UVa 1608 - Non-boring sequences

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  4. UVa 1608 (分治 中途相遇) Non-boring sequences

    预处理一下每个元素左边和右边最近的相邻元素. 对于一个区间[l, r]和区间内某一个元素,这个元素在这个区间唯一当且仅当左右两边最近的相邻元素不在这个区间内.这样就可以O(1)完成查询. 首先查找整个 ...

  5. ●UVA 1608 Non-boring sequences

    题链: https://vjudge.net/problem/UVA-1608#author=chenchonghan题解: 分治 如果一个区间[l,r]里面在p位置出现了一个只出现一次的元素,(如果 ...

  6. UVa 1608 Non-boring sequences (分治)

    题意:给你一个长度为n序列,如果这个任意连续子序列的中都有至少出现一次的元素,那么就称这个序列是不无聊的,判断这个序列是不是无聊的. 析:首先如果整个序列中有一个只出过一次的元素,假设是第 p 个,那 ...

  7. UVA 1608 Non-boring sequence 不无聊的序列(分治,中途相遇)

    题意:给你一个长度为n序列,如果这个任意连续子序列的中都有至少出现一次的元素,那么就称这个序列是不无聊的,判断这个序列是不是无聊的. 先预处理出每个元素之前和之后相同元素出现的位置,就可以在O(1)的 ...

  8. UVA - 1608 Non-boring sequences(分治法)

    题目: 如果一个序列的任意连续的子序列中至少有一个只出现一次的元素,则称这个序列是不无聊的.输入一个n(n≤200000)个元素的序列A(各个元素均为109以内的非负整数),判断它是不是不无聊的. 思 ...

  9. UVA - 1608 Non-boring sequences (分治)

    题意:如果一个序列的任意连续子序列中至少有一个只出现一次的元素,则称这个序列式为non-boring.输入一个n(n≤200000)个元素的序列A(各个元素均为109以内的非负整数),判断它是否无聊. ...

随机推荐

  1. 201521123068《Java程序设计》第5周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 查看脑图->多态与接口 1.2 可选:使用常规方法总结其他上课内容. 2. 书面作业 1.代码阅读:Child压缩包内源 ...

  2. 201521123025<<java程序设计>>第4周学习总结

    Q1. 本周学习总结 Q2.书面作业 1.注释的应用 使用类的注释与方法的注释为前面编写的类与方法进行注释,并在Eclipse中查看.(截图) 2.面向对象设计(大作业1,非常重要) 2.1 将在网上 ...

  3. 201521123087 《Java程序设计》第3周学习总结

    1.本周学习总结 2. 书面作业 代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; publ ...

  4. 201521044091 java 第一周总结

    1.本周学习总结 (1)第一次开始接触java语言,有些用法还是和c和c++有点差异,需要不断去学习 (2)java其实不仅仅一种高级语言,它包括的还有它的整套体系. 2. 书面作业 1.为什么jav ...

  5. 多线程:多线程设计模式(二):Future模式

    一.什么是Future模型: 该模型是将异步请求和代理模式联合的模型产物.类似商品订单模型.见下图: 客户端发送一个长时间的请求,服务端不需等待该数据处理完成便立即返回一个伪造的代理数据(相当于商品订 ...

  6. HDU 6092`Rikka with Subset 01背包变形

    Rikka with Subset Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  7. php调用webservice接口

    项目中使用到了调用三方厂商webService接口.他的接口类似为http://haha.cn:86/BaseInfoService.svc?wsdl,在这里我注意到了"wsdl" ...

  8. NOIP算法总结与复习

    NOIP算法总结与复习 (看了看李总的蓝皮书,收获颇多,记下此文,以明志--) (一)数论 1.最大公约数,最小公倍数 2.筛法球素数 3.mod规律公式 4.排列组合数,错排 5.Catalan数 ...

  9. 51nod 1393 0和1相等串 思路 : map存前缀和

    题目: 思路:把'0'当成数字-1,'1'当成数字1,求前缀和,用map更新当前前缀和最早出现的位置.(用map而不用数组是因为可能会出现负数) 当前缀和的值之前出现过,比如i = 10时,sum = ...

  10. 统计学习方法——CART, Bagging, Random Forest, Boosting

    本文从统计学角度讲解了CART(Classification And Regression Tree), Bagging(bootstrap aggregation), Random Forest B ...