ZOJ-4016 Mergeable Stack链表模拟栈

xiaoxiao2021-02-28  57

题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4016

链表模拟  怕爆内存 把所有申请空间的指针都放到一个vector里消除 结果超时。。。 每次top的时候删除居然不会爆内存。。

#include<bits/stdc++.h> #define maxn 100010 #define ll long long #define INF 0x3f3f3f3f3f3f3f3f using namespace std; typedef struct Node *Stack; struct Node { int data; Stack next; }; Stack s[3*maxn]; Stack se[3*maxn]; void Creat(Stack &s) { s=(Stack)malloc(sizeof(Node)); } int main() { int T; cin>>T; while(T--) { for(int i=0;i<3*maxn;i++) { s[i]=NULL; se[i]=NULL; } //vector<Stack> del; int n,p; scanf("%d%d",&n,&p); while(p--) { int x; scanf("%d",&x); if(x==1) { int i,v; scanf("%d%d",&i,&v); if(s[i]==NULL) { Creat(s[i]); // del.push_back(s[i]); s[i]->data=v; s[i]->next=NULL; se[i]=s[i]; } else { Stack st; Creat(st); //del.push_back(st); st->data=v; st->next=s[i]; s[i]=st; } } else if(x==2) { int i; scanf("%d",&i); if(s[i]==NULL) { printf("EMPTY\n"); } else { printf("%d\n",s[i]->data); Stack st=s[i]; s[i]=s[i]->next; delete st; } } else if(x==3) { int i,t; scanf("%d%d",&i,&t); if(s[t]!=NULL) { if(s[i]==NULL) { s[i]=s[t]; s[t]=NULL; se[i]=se[t]; se[t]=NULL; } else { se[t]->next=s[i]; s[i]=s[t]; s[t]=NULL; se[t]=NULL; } } } } // for(int i=0;i<del.size();i++) // { // if(del[i]!=NULL) // delete del[i]; // } } return 0; }

在网上看到的一种做法  list的splice函数,C++没怎么用过list。。。。其实和手写没什么区别。。

#include<bits/stdc++.h> #define maxn 100010 #define ll long long #define INF 0x3f3f3f3f3f3f3f3f using namespace std; list<int> l[3*maxn]; int main() { int T; scanf("%d",&T); while(T--) { int n,p; scanf("%d%d",&n,&p); for(int i=1;i<=n;i++) l[i].clear(); while(p--) { int x; scanf("%d",&x); if(x==1) { int i,v; scanf("%d%d",&i,&v); l[i].push_back(v); } if(x==2) { int i; scanf("%d",&i); if(l[i].size()) { printf("%d\n",l[i].back()); l[i].pop_back(); } else printf("EMPTY\n"); } if(x==3) { int i,v; scanf("%d%d",&i,&v); l[i].splice(l[i].end(),l[v]);//list拼接的功能。将源list的内容部分或全部元素删除,拼插入到目的list } } } return 0; }
转载请注明原文地址: https://www.6miu.com/read-2628041.html

最新回复(0)