zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Linux基础-yum软件包管理
    Linux基础-rpm软件包管理
    Linux基础-简单的进程操作
    Linux基础-free窥内存-dd探硬盘
    Linux基础-swap交换分区
    Linux基础-软硬连接Block概念
    Linux基础操作-分区概念
    Linux基础-vim编辑器
    Linux基础操作命令-打包压缩
    RandomAccessFile 文件读写中文乱码解决方案!
  • 原文地址:https://www.cnblogs.com/tflsnoi/p/13885819.html
Copyright © 2011-2022 走看看