1. 程式人生 > >C Mergeable Stack(list超好用)

C Mergeable Stack(list超好用)

sizeof 一個 iterator cnblogs define https target 合並 pop

ZOJ 4016

list用法https://www.cnblogs.com/LLLAIH/p/10673068.html

一開始用普通的棧做,超內存,鏈表模擬棧也沒寫出來orz.
補題發現list超好用,真的-6-

有三個操作:1/向棧裏添加數

2/輸出棧頂元素然後pop掉

3/將棧b合並到棧a裏並將棧b清空(註意合並後的順序)

註意註意註意!!一定要將需要使用的list元素進行清空否則會WA!!

註意合並兩個list序列時,用merge的話,會將合並後的序列進行默認的升序排列,所以這題要用splice

#include <cmath>
#include 
<cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> #include <list> #include <map> #include<stack> #include<vector> #define eps 1e-6 #define mod 1000000000 #define PI acos(-1) #define inf 0x3f3f3f3f #define MAX 3e5+5 #define
read(x) scanf("%d",&x) #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; const int maxn=300005; typedef long long LL; list<int> a[maxn]; int main(){ int t,n,q,s,v; scanf("%d",&t); while(t--){ int op; list<int>::iterator it; scanf(
"%d%d",&n,&q); for(int i=1;i<=n;i++) a[i].clear();//清空list裏每個元素 for(int i=1;i<=q;i++){ scanf("%d",&op); if(op == 1){ scanf("%d%d",&s,&v); a[s].push_back(v);//將元素從尾部插入 } else if(op == 2){ scanf("%d",&s); if(a[s].empty())//判斷該棧是否為空 { printf("EMPTY\n"); continue; } printf("%d\n",a[s].back());//輸出棧頂元素即尾部第一個元素 a[s].pop_back();//將棧頂元素彈出 } else { scanf("%d%d",&s,&v); a[s].splice(a[s].end(),a[v]);//將棧v合並到棧s,並清空棧v } } } return 0; }

C Mergeable Stack(list超好用)