zoukankan      html  css  js  c++  java
  • SPOJ:Stack Overflow(并查集)

    Stack is a basic data structure. Where 3 operation can be done-

    1. Push: You can push object to the stack

    2. Pop: You can pop the object to the stack

    3. Top: You can check the value of the top object.

    For further details you can get idea here ( if you really don’t know ) :https://en.wikibooks.org/wiki/Data_Structures/Stacks_and_Queues

    Now we have a problem here, there are N stack in front of you. they are numbered from 1 to N. Each of them are initially empty. Now you will have Q operations. Each operation can be one the below 4 types:

    1. push i x, Push a value of x to stack numbered i

    2. pop i, Pop value from the stack numbered i, if stack is empty discard the operation

    3. put i j, Put the j’th stack on top of the i’th stack. So there will be no element left on the j’th stack.

    4. top i, Print the value of the top element of ith stack. If stack is empty print “Empty!”

    Check the Sample IO for further understanding…

    Input:

    Input starts with an integer T (≤5), denoting the number of test cases.

    The first line of a case is a blank line. The next line contains two integers N (1 ≤ N ≤ 104), Q(1 ≤ Q ≤ 5*104).

    The next Q lines will contain a operation like above mentioned.

    (1≤ I, j ≤ N), (1≤ x ≤ 105)

    Output

    For each test case, print the case number in a single line. Then for each 4th type operation you should print the value or “Empty!” if the stack is empty.

    Input

    Output

    1

    3 18

    push 1 1

    push 2 2

    push 3 3

    push 3 4

    top 1

    top 2

    top 3

    put 1 3

    pop 2

    top 1

    top 2

    top 3

    pop 1

    top 1

    pop 1

    top 1

    pop 1

    top 1

    Case 1:

    1

    2

    4

    4

    Empty!

    Empty!

    3

    1

    Empty!

    Judge data is huge so use faster IO like scanf/printf

    题意:模拟栈的操作。

    思路:本来是水题一道,但是主要很细节,所以还是放这里,方便提醒自己注意细节。

         push元素的时候更新栈首begin和栈定Laxt。

         pop的时候如果空了,注意更新Begin=0;

         put x到y的时候如果x为空或者x==y的时候不不操作。

        

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=100010;
    int Laxt[maxn],Begin[maxn],fa[maxn],cnt,num[maxn];
    char c[10];
    int main()
    {
        int T,N,Q,Case=0,x,i,j;
        scanf("%d",&T);
        while(T--){
            scanf("%d%d",&N,&Q);
            printf("Case %d:
    ",++Case);
            memset(Laxt,0,sizeof(Laxt));
            memset(Begin,0,sizeof(Begin));
            memset(fa,0,sizeof(fa)); cnt=0;
            while(Q--){
                scanf("%s",c); 
                if(c[2]=='s'){      //push
                    scanf("%d%d",&i,&x);
                    num[++cnt]=x;
                    if(!Begin[i]) Begin[i]=cnt;
                    fa[cnt]=Laxt[i];
                    Laxt[i]=cnt;
                }
                else if(c[2]=='t'){ //put
                    scanf("%d%d",&i,&j);
                    if(i!=j&&Laxt[j]){
                       fa[Begin[j]]=Laxt[i];
                       Laxt[i]=Laxt[j];
                       if(!Begin[i]) Begin[i]=Begin[j];
                       Laxt[j]=Begin[j]=0;
                    }
                }    
                else if(c[0]=='p'){ // pop
                    scanf("%d",&i);
                    if(Laxt[i]) Laxt[i]=fa[Laxt[i]];
                    if(!Laxt[i]) Begin[i]=0;
                } 
                else {              //top
                    scanf("%d",&i);
                    if(!Laxt[i]) printf("Empty!
    ");
                    else printf("%d
    ",num[Laxt[i]]);
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    开源交易所源码
    ThinkCMF框架上的任意内容包含漏洞
    UAC绕过初探
    WinDbg常用命令系列---显示当前异常处理程序链!exchain
    WinDbg常用命令系列---错误消息显示!error
    WinDbg常用命令系列---检查符号X
    WinDbg常用命令系列---线程栈中局部上下文切换.frame
    WinDbg常用命令系列---显示数字格式化.formats
    WinDbg常用命令系列---清屏
    WinDbg常用命令系列---!address
  • 原文地址:https://www.cnblogs.com/hua-dong/p/9077439.html
Copyright © 2011-2022 走看看