坐标ZJ,为什么大家都说CCF数据水,而我洛谷民间欢欢喜喜的100,CCF悲悲惨惨的60......
最终,45+0+60+0=105.......
然而,死也得死得明白,求教代码的问题!
#include <bits/stdc++.h>
#define MAXN 500009
using namespace std;
const int inf=0x3f3f3f3f;
int a[MAXN<<1];
int l,r;
int t[MAXN][2],tn[MAXN];
int brother(int p){
return t[a[p]][0]==p?t[a[p]][1]:t[a[p]][0];
}
bool already;
char str[MAXN<<1];
vector<int> fs;int fl,fr;
void dfs(int x){
if(fl==l&&fr==r){
if(1){
int x=0;
x++;
}
for(int i=fs.size()-1;i>=0;i--)
if(a[fs[i]]==a[l]) str[x++]='L',++l;
else str[x++]='R',--r;
already=true;
return;
}
int bl=brother(l),br=brother(r);
if((fs.empty()||bl==fl-1||bl==fr+1)&&l<bl){
++l;
int tfl=fl,tfr=fr;
str[x]='L';
if(fs.empty()) fs.push_back(bl),fl=fr=bl;
else if(bl<l||bl>r);
else if(bl<fl) fs.push_back(bl),fl--;
else fs.push_back(bl),fr++;
dfs(x+1);
if(already)
return;
fs.pop_back();
fl=tfl,fr=tfr;
l--;
}
if((fs.empty()||br==fl-1||br==fr+1)&&r>br){
str[x]='R';
int tfl=fl,tfr=fr;
--r;
if(fs.empty()) fs.push_back(br),fl=fr=br;
else if(br<l||br>r);
else if(br<fl) fs.push_back(br),fl--;
else fs.push_back(br),fr++;
dfs(x+1);
if(already)
return;
fs.pop_back();
fl=tfl,fr=tfr;
++r;
}
}
void solve(int n){
vector<int> vec;
fs.clear();
already=false;
fl=fr=0;
dfs(1);
if(already) printf("%s\n",str+1);
else puts("-1");
}
int main(){
freopen("palin.in","r",stdin);
freopen("palin.out","w",stdout);
int T;
scanf("%d",&T);
while(T--){
int n;
scanf("%d",&n);
l=1,r=2*n;
for(int i=1;i<=2*n;i++)
scanf("%d",&a[i]),t[a[i]][tn[a[i]]++]=i;
solve(n);
memset(str,0,sizeof(str));
memset(t,0,sizeof(t));
memset(tn,0,sizeof(tn));
memset(a,0,sizeof(a));
}
return 0;
}