• 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
    ");
    27     else{
    28         printf("%d
    ", 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 }
  • 相关阅读:
    HDU 4681 STRING dp+暴力。
    HDU 4669 Mutiples on a circle 不知道该归为哪一类。
    poj 3411 Paid Roads很水的DFS
    poj 1724 ROADS 很水的dfs
    STL学习笔记(转,还是比较全的)
    4666 Hyperspace stl
    poj3308 Paratroopers 最大流 最小点权覆盖
    poj 3114 Countries in War
    2013 Multi-University Training Contest 4 部分解题报告
    2013 Multi-University Training Contest 3 部分解题报告
  • 原文地址:https://www.cnblogs.com/changer-qyz/p/8757172.html
Copyright © 2020-2023  润新知