UVA 1608(集训比赛2B_E题)解题报告
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4483
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
题意:如果对于任意子序列,都存在一个独一无二的数,称之为"non-boring",反之"boring"
思路:每次从大的序列中找一个唯一元素,包含这个元素的就不用判断了,那么以这个元素为分界线,在分别判断两边的序列。递归+分治
代码:
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<string> #include<vector> #include<stack> #include<bitset> #include<cstdlib> #include<cmath> #include<set> #include<list> #include<deque> #include<map> #include<queue> #define INF 0X3F3F3F3F using namespace std; typedef long long ll; const double PI = acos(-1.0); const double eps = 1e-6; const int MAXN =2e5+10; int n; int a[MAXN]; int l[MAXN]; int r[MAXN]; map<int,int>lastl; map<int,int>lastr; int jud(int L,int R) { if(L>=R) return 1; int i=L; int j=R; while(i<=j) { if(l[i]<L&&r[i]>R) return jud(L,i-1)&&jud(i+1,R); if(l[j]<L&&r[j]>R) return jud(L,j-1)&&jud(j+1,R); i++; j--; } return 0; } int main() { int T; scanf("%d",&T); for(int k=0;k<T;k++){ scanf("%d",&n); lastl.clear(); lastr.clear(); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } for(int i=1,j=n;i<=n;i++,j--) { if(lastl[a[i]]==0) l[i]=-1; else l[i]=lastl[a[i]]; lastl[a[i]]=i; if(lastr[a[j]]==0) r[j]=INF; else r[j]=lastr[a[j]]; lastr[a[j]]=j; } if(jud(1,n)) printf("non-boring\n"); else printf("boring\n"); } return 0; }

浙公网安备 33010602011771号