代码能力是很重要的,像我,稍微复杂一点的题就做得想吐。
写了个200line+的代码,就已经写的想吐了。重新构思敲一遍得了。
最讨厌的就是无力感啊!
#include<iostream>
#include<cstdio>
#define MN 555555
#define l Recnt&1
#define r (Recnt+1)&1
using namespace std;
struct Node{ int next[2],val,id; }deque[MN<<1],stL[MN<<1],stR[MN<<1];
int Recnt,topL,topR;
int N,M,L,R;
void init()
{
topL=topR=Recnt=0;
for( int i=1;i<=N;i++ )
{
scanf( "%d",&deque[i].val );
deque[i].next[0]=i-1;
deque[i].next[1]=i+1;
deque[i].id=i;
}
deque[0].next[1]=1;
deque[0].next[0]=-1;
deque[0].id=0;
deque[N+1].next[1]=-1;
deque[N+1].next[0]=N;
deque[0].id=N+1;
}
void print()
{
bool f=true;
for( int i=0;i<topL;i++ )
{
if( f ) printf("%d",stL[i].val );
else printf( " %d",stL[i].val );
f=false;
}
for( int i=Recnt&1?R:L;;i=deque[i].next[r] )
{
if( f ) printf( "%d",deque[i].val );
else printf( " %d",deque[i].val );
f=false;
if( l && i==L ) break;
if( r && i==R ) break;
}
for( int i=topR-1;i>=0;i-- )
{
if( f ) printf( "%d",stR[i].val );
else printf( " %d",stR[i].val );
f=false;
}
printf( "\n" );
}
void solve()
{
char str[111];
int val;
scanf( "%d %d %d",&L,&R,&M );
for( int i=1;i<L;i++ )
stL[topL++]=deque[i];
for( int i=N;i>R;i-- )
stR[topR++]=deque[i];
getchar();
int NN=N+2;
while( M-- )
{
gets(str);
if( !strcmp(str,"MoveLeft R") )
{
if( Recnt&1 )
{
stR[topR].id=L;
stR[topR++]=deque[L];
L=deque[L].next[l];
}
else
{
stR[topR].id=R;
stR[topR++]=deque[R];
R=deque[R].next[l];
}
}
else if( !strcmp(str,"MoveLeft L") )
{
deque[L].next[l]=stL[topL-1].id;
stL[topL-1].next[r]=L;
topL--;
L=deque[L].next[l];
}
else if( !strcmp(str,"MoveRight R") )
{
deque[R].next[r]=stR[topR-1].id;
stR[topR-1].next[l]=R;
topR--;
R=deque[R].next[r];
}
else if( !strcmp(str,"MoveRight L") )
{
if( Recnt&1 )
{
stL[topL].id=R;
stL[topL++]=deque[R];
R=deque[R].next[r];
}
else
{
stL[topL].id=L;
stL[topL++]=deque[L];
L=deque[L].next[r];
}
}
else if( sscanf(str,"Insert L %d",&val) )
{
if( Recnt&1 )
{
deque[NN].val=val;
deque[NN].next[l]=R;
deque[NN].next[r]=deque[R].next[r];
deque[deque[R].next[r]].next[l]=NN;
deque[R].next[r]=NN++;
//R=deque[R].next[r];
}
else
{
deque[NN].val=val;
deque[NN].next[l]=deque[L].next[l];
deque[NN].next[r]=L;
deque[deque[L].next[l]].next[r]=NN;
deque[L].next[l]=NN++;
L=deque[L].next[l];
}
}
else if( sscanf(str,"Insert R %d",&val) )
{
if( Recnt&1 )
{
deque[NN].val=val;
deque[NN].next[l]=deque[L].next[l];
deque[NN].next[r]=L;
deque[deque[L].next[l]].next[r]=NN;
deque[L].next[l]=NN++;
L=deque[L].next[l];
}
else
{
deque[NN].val=val;
deque[NN].next[l]=R;
deque[NN].next[r]=deque[R].next[r];
deque[deque[R].next[r]].next[l]=NN;
deque[R].next[r]=NN++;
R=deque[R].next[r];
}
}
else if( !strcmp(str,"Delete L") )
{
if( Recnt&1 )
{
deque[deque[R].next[l]].next[r]=deque[R].next[r];
deque[deque[R].next[r]].next[l]=deque[R].next[l];
R=deque[R].next[r];
}
else
{
deque[deque[L].next[l]].next[r]=deque[L].next[r];
deque[deque[L].next[r]].next[l]=deque[L].next[l];
L=deque[L].next[r];
}
}
else if( !strcmp(str,"Delete R") )
{
if( Recnt&1 )
{
deque[deque[L].next[l]].next[r]=deque[L].next[r];
deque[deque[L].next[r]].next[l]=deque[L].next[l];
L=deque[L].next[l];
}
else
{
deque[deque[R].next[l]].next[r]=deque[R].next[r];
deque[deque[R].next[r]].next[l]=deque[R].next[l];
R=deque[R].next[l];
}
}
else if( !strcmp(str,"Reverse") )
{
Recnt^=1;
}
//print();
}
}
int main()
{
freopen( "test.in","r",stdin );
freopen( "test.out","w",stdout );
int T;
scanf( "%d",&T );
while( T-- )
{
scanf( "%d",&N );
init();
solve();
print();
}
return 0;
}