http://2014.sprout.csie.org/oj/pro/21/
題目要求一個link list,記錄賽車的名次。
我先建了兩個陣列,F、B分別指向前面、後面,然後只要有人被攻擊,就讓他前面跟後面的人修改值,如果超車也一樣,要注意的是,第一名的車子會換,所以HEAD指到的車也會換,但是一般修改不會改到他。
我的作法是紀錄誰還活著,從還活著的開始往前找到第一名,在輸出。
但其實可以新增一台第0名得車子,輸出時忽略他就好。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| #include <cstdio> #include <cstdlib> #include <iostream> #define N 100001 using namespace std; int F[N],B[N]; bool L[N]={0}; void PP(){ int tmp=1; while(L[tmp])tmp++; for(int i=F[tmp];i!=-1;i=F[i])tmp=i; for(int i=tmp;i!=-1;i=B[i])printf("(%d)%d(%d) ",F[i],i,B[i]); puts(""); } int main(int arc,char *argv[]) { int n,q,a,b; scanf("%d",&n); for(int i=1;i<=n;i++)F[i]=i-1; F[1]=-1; for(int i=1;i<=n;i++)B[i]=i+1; B[n]=-1; scanf("%d",&q); while(q--){ scanf("%d %d",&a,&b); if(a==0){ if(B[b]!=-1)F[B[b]]=F[b]; if(F[b]!=-1)B[F[b]]=B[b]; F[b]=B[b]=-1; L[b]=1; }else if(a==1){ int tmpb=B[b],tmpf=F[b]; if(tmpf!=-1)B[b]=tmpf; if(tmpf!=-1){ F[b]=F[tmpf]; if(F[tmpf]!=-1)B[F[tmpf]]=b; } if(tmpf!=-1)F[tmpf]=b; if(tmpf!=-1)B[tmpf]=tmpb; if(tmpb!=-1&&tmpf!=-1)F[tmpb]=tmpf; } } int tmp=1; while(L[tmp])tmp++; for(int i=F[tmp];i!=-1;i=F[i])tmp=i; printf("%d",tmp); for(int i=B[tmp];i!=-1;i=B[i])printf(" %d",i); puts(""); system("pause"); return 0; }
|