警示后人
查看原帖
警示后人
263414
Sktic楼主2022/10/21 22:52

千万不要一意孤行写四指针。细节超多调的我头掉,其中因为cnt局部覆盖全局调了超久。。

最后重构终于A了。

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
typedef long long ll;
inline int read()
{
	int x=0;
	char c=getchar();
	while(c<'0'||c>'9')
		c=getchar();
	while(c>='0'&&c<='9')
		x=x*10+(c-'0'),c=getchar();
	return x;
}
int a[maxn];
int vis[maxn];
char ans[maxn];
int n,cnt;
inline int check(int a,int b)
{
	return (1<=a&&a<=2*n)&&(1<=b&&b<=2*n)&&(!vis[a])&&(!vis[b]);
}
inline void up(int a,int b)
{
	ans[cnt]=(a==1?'L':'R');ans[2*n-cnt+1]=(b==1?'L':'R');
	cnt++;
}
inline int sol(int fir)
{
	memset(ans,'\0',sizeof(ans));
	memset(vis,0,sizeof(vis));
	cnt=1;
	int zl=1,zr=2*n,mul=1,ql,qr;
	while(a[++mul]!=a[fir]&&1<=mul&&mul<=2*n);
	vis[fir]=1,vis[mul]=1;
	if(fir==1)zl++;
	else zr--;
	ql=mul-1,qr=mul+1;
	if(fir==1&&mul==2*n)zr--;
	if(fir==2*n&&mul==1)zl++;
	up((fir==1?1:2),1);
	while(cnt<=n)
	{
		if(a[zl]==a[ql]&&zl!=ql&&check(zl,ql))
			up(1,1),vis[zl]=1,vis[ql]=1,ql--,zl++;
		else if(a[zl]==a[qr]&&zl!=qr&&check(zl,qr))
			up(1,2),vis[zl]=1,vis[qr]=1,qr++,zl++;
		else if(a[zr]==a[ql]&&zr!=ql&&check(zr,ql))
			up(2,1),vis[zr]=1,vis[ql]=1,ql--,zr--;
		else if(a[zr]==a[qr]&&zr!=qr&&check(zr,qr))
			up(2,2),vis[zr]=1,vis[qr]=1,qr++,zr--;
		else
			return -1;
	}
	for(int i=1;i<=2*n;i++)
		putchar(ans[i]);
	putchar('\n');
	return 1;
}
int main()
{
	int t=read();
	while(t--)
	{
		memset(a,0,sizeof(a));
		n=read();
		for(int i=1;i<=2*n;i++)
			a[i]=read();
		if(sol(1)==1)
			continue;
		else if(sol(2*n)==1)
			continue;
		else
			cout<<-1<<endl;
	}
	return 0;
}

顺便问一下这个代码有没有好一点的优化,不至于跑两遍

2022/10/21 22:52
加载中...