P1160 队列安排

题目链接https://www.luogu.com.cn/problem/P1160

很裸的一道队列的题

方法一:没审清题目,,直接就来写,笨笨得每次都扫描一遍链表导致TLE,最后得分40分

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n, k, p, m, x;
 4 struct lb{//链表的结点:当前数值、上一个位置、下一位置 
 5     int num;
 6     int last;
 7     int next;
 8 };
 9 lb l[100010];
10 int tail=1;//队尾计数 
11 int head=0;//链表头 
12 int chazhao(int k){//用于查询链表的下标 
13     for(int i=head; i; i=l[i].next)
14         if(l[i].num==k)return i;
15     return 0;
16 }
17 void print(){//测试使用 
18     for(int i=1; i<=tail; i++)
19         cout<<i<<":"<<l[i].num<<":"<<l[i].last<<":"<<l[i].next<<endl;
20 }
21 void shuchu(){//输出队列 
22     for(int i=head; i; i=l[i].next)
23         cout<<l[i].num<<" ";
24     cout<<endl;
25 }
26 void charu(int i, int t, int p){
27     l[++tail].num=i;//链表数组末端插入数据 
28     if(p==0){//判断左插入 
29         l[tail].next=t;
30         l[tail].last=l[t].last;
31         if(l[t].last==-1){
32             head=tail;
33         }
34         else{
35             l[l[t].last].next=tail;
36         }
37         l[t].last=tail;
38     }
39     if(p==1){//判断右插入 
40         l[tail].next=l[t].next;
41         l[tail].last=t;
42         if(l[t].next!=0){
43             l[l[t].next].last=tail;
44         }
45         l[t].next=tail;
46     }
47     //print();
48 }
49 void del(int t){
50     if(l[t].last==-1){
51         head=l[t].next;
52         l[l[t].next].last=-1;
53     }
54     else{
55         l[l[t].last].next=l[t].next;
56         if(l[t].next!=0){
57             l[l[t].next].last=l[t].last;
58         }
59     }
60 }
61 int main()
62 {
63     
64     cin>>n;
65     head=1;
66     l[tail].num=1; l[tail].next=0; l[tail].last=-1;
67     for(int i=2; i<=n; i++){
68         cin>>k>>p;
69         int t=chazhao(k);
70         //cout<<t<<endl;
71         charu(i, t, p);
72         //shuchu();
73     }
74     cin>>m;
75     while(m--){
76         cin>>x;
77         int t=chazhao(x);
78         if(t)
79             del(t);
80         //shuchu();
81     }
82     shuchu();
83     return 0;
84  } 

 方法二:修改之后不再超时,但仍然只有40分,但很还是有细节修改了1天也搞不出来

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n, k, p, m, x;
 4 struct lb{//链表的结点:当前数值、上一个位置、下一位置 
 5     int last;
 6     int next;
 7 };
 8 lb l[100100];
 9 
10 int head;//链表头 
11 
12 void print(){//测试使用 
13     for(int i=1; i<=n; i++)
14         cout<<i<<":"<<l[i].last<<":"<<l[i].next<<endl;
15 }
16 void shuchu(){//输出队列 
17     for(int i=head; i!=-2; i=l[i].next)
18         cout<<i<<" ";
19     cout<<endl;
20 }
21 void charu(int i, int t, int p){//在t的左0(右1)插入i 
22     if(p==0){//判断左插入 
23         l[i].next=t;
24         l[i].last=l[t].last;
25         if(l[t].last==-1){
26             head=i;
27         }
28         else{
29             l[l[t].last].next=i;
30         }
31         
32         l[t].last=i;
33     }
34     if(p==1){//右插入 
35         l[i].next=l[t].next;
36         l[i].last=t;
37         if(l[t].next!=-2){
38             l[l[t].next].last=i;
39         }
40         l[t].next=i;
41     }
42     //print();
43 }
44 void del(int t){
45     if(l[t].last==-1){
46         head=l[t].next;
47         if(l[t].next!=-2)
48             l[l[t].next].last=-1;
49     }
50     
51     else{
52         l[l[t].last].next=l[t].next;
53         if(l[t].next!=-2){
54             l[l[t].next].last=l[t].last;
55         }
56     }
57     
58 }
59 int main()
60 {
61     
62     cin>>n;
63     head=1;
64     l[1].next=-2; l[1].last=-1;
65     for(int i=2; i<=n; i++){
66         cin>>k>>p;
67         charu(i, k, p);
68         //shuchu();
69     }
70     cin>>m;
71     while(m--){
72         cin>>x;
73         del(x);
74         //shuchu();
75     }
76     shuchu();
77     return 0;
78  } 

上述代码麻烦之处在于对链表头和尾的处理和讨论,所以还是认真的研究了一下别人的题解:

https://www.luogu.com.cn/blog/LittleRewriter/solution-p1160

原文地址:https://www.cnblogs.com/tflsnoi/p/13885819.html