zoj4016 Mergeable Stack

题意:对n个栈,有q次操作。每个操作可能为三种情况中的一种:1.将v插入到s栈的顶端;2.输出s栈的栈顶(若栈为空则输出empty);3.将栈t插入到栈s的栈顶。

开始考虑到指针可能会mle,用数组模拟链表来实现。迷之wa,中间少写一句,若s栈为空,则s栈的栈顶变为t栈的栈顶。

 

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 
 5 const int maxn = 3e5+10;
 6 struct node{
 7     long long data;
 8     long long pre;
 9 }arr[maxn];
10 struct list{
11     long long top;
12     long long head;
13 }lst[maxn];
14 long long used;
15 
16 void insert(long long s, long long v){
17     arr[used].data = v;
18     arr[used].pre = lst[s].top;
19     lst[s].top = used;
20     if (lst[s].head == -1)
21         lst[s].head = used;
22     used++;
23 }
24 void pop(long long s){
25     if (lst[s].top == -1)
26         printf("EMPTY\n");
27     else{
28         printf("%d\n", arr[lst[s].top].data);
29         lst[s].top = arr[lst[s].top].pre;
30         if (lst[s].top == -1)
31             lst[s].head = -1;
32     }
33 }
34 void move(long long s, long long t){  //把t放到s上 
35     if (lst[t].top != -1){
36         arr[lst[t].head].pre = lst[s].top;
37         if (lst[s].top==-1) lst[s].head=lst[t].head; 
38         lst[s].top = lst[t].top;
39         lst[t].top = lst[t].head = -1;
40     }
41 }
42 
43 int main(){
44     int T;
45     scanf("%d", &T);
46 
47     while (T--){
48         long long n,q;
49         scanf("%lld%lld", &n, &q);
50         used = 0;
51         memset(lst, -1, sizeof(lst));
52         long long s,t,mod;
53         long long v;
54         while (q--){
55             scanf("%lld", &mod);
56             if (mod == 1){
57                 scanf("%lld%lld", &s, &v);
58                 insert(s, v);
59             }
60             else if (mod == 2){
61                 scanf("%lld", &s);
62                 pop(s);
63             }
64             else {
65                 scanf("%lld%lld", &s, &t);
66                 move(s, t);
67             }
68         }
69     }
70 
71     return 0;
72 }

 

posted @ 2018-04-09 08:47  Changer-qyz  阅读(357)  评论(0)    收藏  举报