SPOJ:Stack Overflow(并查集)
Stack is a basic data structure. Where 3 operation can be done-
-
Push: You can push object to the stack
-
Pop: You can pop the object to the stack
-
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:
-
push i x, Push a value of x to stack numbered i
-
pop i, Pop value from the stack numbered i, if stack is empty discard the operation
-
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.
-
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:\n",++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!\n"); else printf("%d\n",num[Laxt[i]]); } } } return 0; }