CSU-ACM2017暑期训练3 J

来源:互联网 发布:神机妙算软件安装流程 编辑:程序博客网 时间:2024/05/16 15:30

大意是给一个数字串,若它的每一个子串都有一个在这个字串中只出现一次的元素,那么久是不boring 的。

此题巧妙的运用了分治,先预处理出每个数字前一个相同的和后一个相同的数字的位置,用map,map.clear()比memset快,很奇怪。

然后就为(l,r)区间进行判断,从2边开始往中间找,若x位置发现一个单独数字,则再找(l,x-1),(x+1,r);复杂度跟归并排序相似nlogn

今天发现惊天秘密,next再UVA上会编译错误,而devc++上可过编译,当年fytNOIP2015DAY1T2被 link数组坑掉,也是因为linux下编译错误!

#!include<cstdio>#include<cstring>#include<map>#define maxl 200001using namespace std;int n,t;int a[maxl],last[maxl],nxt[maxl];map <int,int> mp;//next会编译出错 bool jug(int l,int r){if(l>r)return true;for(int i=l,j=r;i<=j;i++,j--){if(last[i]<l && nxt[i]>r) return jug(l,i-1)&&jug(i+1,r);if(last[j]<l && nxt[j]>r) return jug(l,j-1)&&jug(j+1,r);}return false;}int main(){scanf("%d",&t);for(int i=1;i<=t;i++){scanf("%d",&n);for(int j=1;j<=n;j++)scanf("%d",&a[j]);mp.clear();for(int j=1;j<=n;j++)if(mp.count(a[j]))last[j]=mp[a[j]],mp[a[j]]=j;elselast[j]=0,mp[a[j]]=j;mp.clear();for(int j=n;j>=1;j--)if(mp.count(a[j]))nxt[j]=mp[a[j]],mp[a[j]]=j;elsenxt[j]=n+1,mp[a[j]]=j;if(jug(1,n))printf("non-boring\n");elseprintf("boring\n");}return 0;}