ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

UVA1608 不无聊的序列 Non-boring sequences

2021-09-03 19:04:40  阅读:129  来源: 互联网

标签:Non now int boring UVA1608 namespace 两边 区间 include


询问一个区间是否为一个排列,通常记录左右第一个在哪里出现。

从两遍往中间扫,发现某一个点满足第一个左右两边的数都不在当前区间范围内,那么他可以把区间分为两个部分且他自己满足条件,(因为要连续)继续递归求解即可。

由于两边同时计算,复杂度为\(O(nlogn)\)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<map>
#include<stack>
#include<vector>
#include<set>
#include<iomanip>
#include<ctime>
#include<cstdlib>
#include<cmath>
using namespace std;
#define orz cout<<"lyakioi!!!!!!!!!!!!!!!!!"<<endl
inline int R(){int s=0,k=1;char c=getchar();while(!isdigit(c)){if(c=='-')k=-1;c=getchar();}while(isdigit(c)){s=s*10+c-'0';c=getchar();}return s*k;}
int t,n,a[1000001],l[1000001],r[1000001];
map<int,int>m;
bool dfs(int now_l,int now_r)
{
	if(now_l>=now_r)return 1;
	for(int i=0;i<=(now_r-now_l+1)/2;i++)
	{
		int x=now_l+i,y=now_r-i;
		if(l[x]<now_l&&now_r<r[x])
		return dfs(now_l,x-1)&dfs(x+1,now_r);
		if(l[y]<now_l&&now_r<r[y])
		return dfs(now_l,y-1)&dfs(y+1,now_r);
	}
	return 0;
}
int main()
{
	t=R();
	while(t--)
	{
		m.clear();
		n=R();
		for(int i=1;i<=n;i++)
		l[i]=0,r[i]=1e9;
		for(int i=1;i<=n;i++)
		{
			a[i]=R();
			if(m.find(a[i])!=m.end())
			{
				int x=m[a[i]];
				r[x]=i;
				l[i]=x;
			}
			m[a[i]]=i;
		}
//		for(int i=1;i<=n;i++)cout<<l[i]<<" "<<r[i]<<endl;
		if(dfs(1,n))puts("non-boring");
		else puts("boring");
	}
}

标签:Non,now,int,boring,UVA1608,namespace,两边,区间,include
来源: https://www.cnblogs.com/lytql/p/15224533.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有