分治法很容易想到。
中途相遇法真是个神奇的东西。
意思大概就是,你可以从两边出发去寻找答案,然而无论你从那一边出发,随着寻找的次数逐渐增多,枚举量飞速增长,因此你不如从两边一起找,这样两边的枚举量都能显著控制在较低水平,从而提高程序效率。
感觉在uva超时了就很有可能是数组越界了。。。
代码
#include<bits/stdc++.h>
#define maxn 200010
#define INF 0X3F3F3F3F
using namespace std;
int n;
int a[maxn];
int l[maxn];
int r[maxn];
map<int,int>lastl;
map<int,int>lastr;
bool br(int L,int R)
{
if(L>=R) return true;
int i=L;
int j=R;
while(i<=j)
{
if(l[i]<L&&r[i]>R) return br(L,i-1)&&br(i+1,R);
if(l[j]<L&&r[j]>R) return br(L,j-1)&&br(j+1,R);
i++;
j--;
}
return false;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=1;i<=