打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
[ZOJ 4016] Mergable Stack

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

直接用栈爆内存,看网上大神用数组实现的,构思巧妙,学习了!

AC代码:

/* * 用数组实现栈的一些操作 */#include <cstdio>#include <cstring>using namespace std;const int maxn = 300005;int arr[maxn]; //存放所有的数据//top代表栈顶元素在arr中的下标,//Next代表栈顶元素下一个元素在arr中的下标,用于实现在栈顶元素被抛出后,栈顶新的指向,//bottom代表栈低元素在arr中的位置int top[maxn], Next[maxn], bottom[maxn];int main() {    int T;    scanf("%d", &T);    int n, q;    int op, cnt;    int s, v, t;    while (T--) {        cnt = 0;        memset(top, 0, sizeof(top));        memset(Next, 0, sizeof(Next));        memset(bottom, 0, sizeof(bottom));        scanf("%d%d", &n, &q);        while (q--) {            scanf("%d", &op);            if (op == 1) {                scanf("%d%d", &s, &v);                arr[  cnt] = v;                if (bottom[s] == 0) {  //如果原先栈为空,新加入的第一个元素将成为栈底元素                    bottom[s] = cnt;                }                //更新栈顶元素和栈顶的下一个元素                Next[cnt] = top[s]; //也可写作Next[top[s]] = top[s];                top[s] = cnt;            } else if (op == 2) {                scanf("%d", &s);                if (top[s]) {                    printf("%d\n", arr[top[s]]); //抛出栈顶元素,注意,top存放的是栈顶元素在arr中的下标                    top[s] = Next[top[s]]; //栈顶元素重定向                    if (top[s] == 0) {  //若栈为空,则栈顶和栈底都置为0,容易忽略这个判断                        bottom[s] = 0;                    }                } else {                    printf("EMPTY\n");                }            } else if (op == 3) {                scanf("%d%d", &s, &t);                if (top[t]) {                    if (bottom[s] == 0) {  //如果第s个栈为空,则s的栈底就是t的栈底                        bottom[s] = bottom[t];                    }                    //t的栈底元素的下一个为s的栈顶元素,这里不用在重定向s栈顶元素的下一个元素,因为t已经指定过了                    Next[bottom[t]] = top[s];                    top[s] = top[t];                }                top[t] = bottom[t] = 0; //把第t个栈置为空,容易忽略            }        }    }    return 0;}

我写的代码,不能AC

/* * Memory Limit Exceeded */#include <stack>#include <cstdio>using namespace std;const int maxn = 300005;stack<int> arr[maxn];int maze[maxn];int x, y, z;void solve_push(int y, int z) {    arr[y].push(z);}void solve_top(int y) {    if (!arr[y].empty()) {        int x = arr[y].top();        arr[y].pop();        printf("%d\n", x);    } else {        printf("EMPTY\n");    }}void solve_move(int y, int z) {    stack<int> temp;    int x;    while (!arr[z].empty()) {        x = arr[z].top();        arr[z].pop();        temp.push(x);    }    while (!temp.empty()) {        x = temp.top();        temp.pop();        arr[y].push(x);    }}int main() {    int t;    int n, q;    int flag;    scanf("%d", &t);    while (t--) {        flag = 0;        scanf("%d%d", &n, &q);        for (int i = 0; i < q; i  ) {            scanf("%d", &x);            if (x == 1) {                scanf("%d%d", &y, &z);                maze[flag  ] = y;                solve_push(y, z);            }            if (x == 2) {                scanf("%d", &y);                maze[flag  ] = y;                solve_top(y);            }            if (x == 3) {                scanf("%d%d", &y, &z);                maze[flag  ] = y;                maze[flag  ] = z;                solve_move(y, z);            }        }        for (int i = 0; i < flag; i  ) {            while (!arr[maze[flag]].empty()) {                arr[maze[flag]].pop();            }        }    }    return 0;}
来源:http://www.icode9.com/content-4-174751.html
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
省选知识点-并查集与带权并查集介绍及应用
浙大 1259 火车
最长上升子序列(LIS)长度的O(nlogn)算法
重温经典的迷宫算法实现
第5关:彩票生成程序
[2020蓝桥杯B组省赛] E-七段码
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服