题目背景

某地ENLIGHTENEDXM研究所正在研究Portal的处理法则,想要揭示XM能量的来源以及应用XM能量ENLIGHTENED的首席科学家Jacks发现其能量的运算法则以及运算方法,但是方法十分复杂,仅靠人手工计算是很难算出答案的,所以它需要你协助他完成计算。

题目描述

Portal计算XM能量是通过个22个栈(00号栈,11号栈)实现的,它把对XM能量的操作如下

PUSHPUSH XX NUMNUM

把NUMNUM加入到X号栈的栈顶。

POPPOP XX

把XX号栈的栈顶元素删除。

ADDADD XX

取出00号栈和11号栈的元素各一个,并且把它的和放入XX号栈。

SUBSUB XX

取出00号栈和11号栈的元素各一个,并且把它的差的绝对值放入XX号栈。

DELDEL XX

清空XX号栈中所有元素不管栈是否为空。

MOVEMOVE XX YY

循环操直到YY号栈为空,把YY号栈的栈顶元素加入到XX号栈,删除YY号栈的栈顶元素。

数据保证X和Y不相同

SWAPSWAP

将两个栈的所有元素调换。

ENDEND

代表命令结束,并且分两行分别输出0号栈和1号栈由栈顶到栈底的元素的值,若栈内无元素,输出NONE。数据保证指令以END结束且仅有一个END,并且也需要输出SUCCESS

AKNOIAKNOI

等为无效操作,无效操作后不接数字。

更正不会有类似无效操作

对于每一行指令,若当前指令成功执行输出SUCCESS,若取出或删除元素时栈内为空或者没有对应指令输出UNSUCCESS并且不执行该行指令。

输入输出格式

输入格式:

输入若干行指令,以END指令结束

输出格式:

对于每一次操作,都要对应输出SUCCESS或者UNSUCCESS,对于END根据指令描述输出栈内元素。

输入输出样例

输入样例#1: 复制

PUSH 0 10
PUSH 0 20
PUSH 0 30
PUSH 0 40
PUSH 1 50
PUSH 1 60
ADD 0
ADD 0
ADD 0
END
输出样例#1: 复制

SUCCESS
SUCCESS
SUCCESS
SUCCESS
SUCCESS
SUCCESS
SUCCESS
SUCCESS
UNSUCCESS
SUCCESS
150 30 20 10
NONE
输入样例#2: 复制

PUSH 0 10
PUSH 0 20
PUSH 0 30
PUSH 0 40
PUSH 1 50
PUSH 1 60
MOVE 0 1
END
输出样例#2: 复制

SUCCESS
SUCCESS
SUCCESS
SUCCESS
SUCCESS
SUCCESS
SUCCESS
SUCCESS
50 60 40 30 20 10
NONE

说明

对于20\%20%的数据 数据保证不会出现MOVE/SWAP操作,$命令总数 \leq 100$

对于40\%40%的数据 $命令总数 \leq 1000$

对于60\%60%的数据 数据保证MOVE/SWAP的操作次数不会超过1000010000次,$命令总数 \leq 10^5$

对于100\%100%的数据 $0 \leq X,Y \leq 1,命令总数 \leq 10^6$

数据保证无论任何情况,栈中元素的值XX满足$0 \leq x \leq 2^{63}-1​$

题目创意来源OIERBBS

/*
最暴力的模拟思路了 60分
正解应该是在move和swap操作上用了什么奇奇怪怪的高级的东西。
*/
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
string s;
int x,y,top[];
long long num[],stack[][];
int main(){
while(cin>>s){
if(s[]=='P'&&s[]=='U'){
scanf("%d%d",&x,&y);
stack[x][++top[x]]=y;
printf("SUCCESS\n");
}
else if(s[]=='P'&&s[]=='O'){
scanf("%d",&x);
if(top[x]==) printf("UNSUCCESS\n");
else{
top[x]--;printf("SUCCESS\n");
}
}
else if(s[]=='A'){
scanf("%d",&x);
if(top[]==||top[]==) printf("UNSUCCESS\n");
else{
int x0=stack[][top[]--];
int x1=stack[][top[]--];
stack[x][++top[x]]=x0+x1;
printf("SUCCESS\n");
}
}
else if(s[]=='S'&&s[]=='U'){
scanf("%d",&x);
if(top[]==||top[]==) printf("UNSUCCESS\n");
else{
int x0=stack[][top[]--];
int x1=stack[][top[]--];
stack[x][++top[x]]=abs(x0-x1);
printf("SUCCESS\n");
}
}
else if(s[]=='D'){
scanf("%d",&x);top[x]=;
printf("SUCCESS\n");
}
else if(s[]=='M'){
scanf("%d%d",&x,&y);
while(top[y]){
int tmp=stack[y][top[y]];
stack[x][++top[x]]=tmp;
top[y]--;
}
printf("SUCCESS\n");
}
else if(s[]=='S'&&s[]=='W'){
for(int i=;i<=top[];i++)
num[i]=stack[][i];
for(int i=;i<=top[];i++)
stack[][i]=stack[][i];
for(int i=;i<=top[];i++)
stack[][i]=num[i];
swap(top[],top[]);
printf("SUCCESS\n");
}
else if(s[]=='E'){
printf("SUCCESS\n");
if(top[])
for(int i=top[];i>=;i--)
cout<<stack[][i]<<" ";
else printf("NONE");printf("\n");
if(top[])
for(int i=top[];i>=;i--)
cout<<stack[][i]<<" ";
else printf("NONE");
return ;
}
}
}

60分

所以说emm...正解是用链表进行维护的。

#include <bits/stdc++.h>
#define ll long long
#define rep(i,l,r) for (int i = l; i <= r; i++)
#define getc(x) getchar(x)
#define putc(x) putchar(x) template <typename T> inline void read(T &x) {
x = ; register char ch; register bool fl = ;
while (ch = getc(), ch < || < ch) fl ^= ch == '-'; x = (ch & );
while (ch = getc(), < ch && ch < ) x = (x << ) + (x << ) + (ch & );
if (fl) x = -x;
}
template <typename T> inline void readc(T &x) {
while (x = getc(), !islower(x) && !isupper(x));
}
template <typename T> inline void print(T x, char c = ' ') {
static int buf[];
if (x == ) { putc(''); putc(c); return; }
if (x < ) putc('-'), x = -x;
for (buf[] = ; x; x /= ) buf[++buf[]] = x % + ;
while (buf[]) putc((char) buf[buf[]--]);
putc(c);
} const int maxn = ; int x, y, opt, cnt, finish_game;
int pre[maxn], nxt[maxn], hed[];
ll k, val[maxn]; inline void link(int u, int v) {
nxt[u] = v;
pre[v] = u;
} inline void simple_push(int u, int v, ll w) {
val[++cnt] = w;
link(u, cnt);
link(cnt, v);
} inline void push(int x, ll k) {
if (x == ) simple_push(pre[], , k);
else simple_push(, nxt[], k);
} inline ll pop(int u) {
link(pre[u], nxt[u]);
return val[u];
} void printout(int u) {
if (u == ) {
if (pre[] == ) {
printf("NONE\n");
return;
}
for (int i = pre[]; i != ; i = pre[i])
print(val[i]);
putc('\n');
} else {
if (nxt[] == ) {
printf("NONE\n");
return;
}
for (int i = nxt[]; i != ; i = nxt[i])
print(val[i]);
putc('\n');
}
} int read_opt() {
char c1, c2;
readc(c1), readc(c2);
if (c1 == 'P')
return c2 == 'U' ? : ;
if (c1 == 'A')
return ;
if (c1 == 'S') {
if (c2 == 'U')
return ;
readc(c2), readc(c2);
return ;
}
if (c1 == 'D')
return ;
if (c1 == 'M')
return ;
if (c1 == 'E')
return ;
return ;
} bool solve(int opt) {
if (opt == ) {
read(x), read(k);
x = hed[x];
push(x, k);
} else if (opt == ) {
read(x);
x = hed[x];
if (x == ) {
if (pre[] == ) return false;
pop(pre[]);
} else {
if (nxt[] == ) return false;
pop(nxt[]);
}
} else if (opt == ) {
read(x);
x = hed[x];
if (pre[] == || nxt[] == ) return false;
push(x, pop(pre[]) + pop(nxt[]));
} else if (opt == ) {
read(x);
x = hed[x];
if (pre[] == || nxt[] == ) return false;
push(x, std::abs(pop(pre[]) - pop(nxt[])));
} else if (opt == ) {
read(x);
x = hed[x];
if (x == ) link(, );
else link(, );
} else if (opt == ) {
read(x), read(y);
x = hed[x], y = hed[y];
link(pre[], nxt[]);
if (x == ) {
link(pre[], );
link(, );
} else {
link(, nxt[]);
link(, );
}
} else if (opt == ) {
std::swap(hed[], hed[]);
} else if (opt == ) {
finish_game = ;
}
return true;
} int main() {
cnt = ;
link(, ), link(, );
hed[] = , hed[] = ;
while (!finish_game) {
opt = read_opt();
if (solve(opt)) puts("SUCCESS");
else puts("UNSUCCESS");
}
printout(!hed[] ? : );
printout(!hed[] ? : );
return ;
}

洛谷 U41572 Portal2的更多相关文章

  1. [洛谷P4940]Portal2

    题目大意:维护两个栈,几个操作: $PUSH\;x\;num:$把$num$压入栈$x$ $POP\;x:$弹出栈$x$栈顶元素 $ADD\;x:$取出两个栈栈顶,把相加值压入栈$x$ $SUB\;x ...

  2. 『题解』洛谷P1063 能量项链

    原文地址 Problem Portal Portal1:Luogu Portal2:LibreOJ Portal3:Vijos Description 在\(Mars\)星球上,每个\(Mars\)人 ...

  3. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  4. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  5. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  6. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP

    题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...

  7. 洛谷P1710 地铁涨价

    P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交  讨论  题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ...

  8. 洛谷P1371 NOI元丹

    P1371 NOI元丹 71通过 394提交 题目提供者洛谷OnlineJudge 标签云端评测 难度普及/提高- 提交  讨论  题解 最新讨论 我觉得不需要讨论O long long 不够 没有取 ...

  9. 洛谷P1538迎春舞会之数字舞蹈

    题目背景 HNSDFZ的同学们为了庆祝春节,准备排练一场舞会. 题目描述 在越来越讲究合作的时代,人们注意的更多的不是个人物的舞姿,而是集体的排列. 为了配合每年的倒计时,同学们决定排出——“数字舞蹈 ...

随机推荐

  1. hihocoder offer收割编程练习赛12 B 一面砖墙

    思路: 就是求哪个长度出现的次数最多. 实现: #include <iostream> #include <cstdio> #include <algorithm> ...

  2. Vue.js学习笔记--2.基础v-指令

    整理自官网教程 -- https://cn.vuejs.org/ 1. v-bind绑定Class与Style a. 绑定Class 语法:v-bind:class="{classname: ...

  3. Unity笔记(4)自学第六天

    今天主要是写了demo的策划案 [关卡设计部分]: [关卡数值设计]:

  4. android手机web网站拨打电话几种方式

    1. <input name="phone" format="*m" value="13"/> <do type=&quo ...

  5. Swift Intermediate Language (SIL)

    Swift Intermediate Language (SIL) https://github.com/apple/swift/blob/master/docs/SIL.rst#witness-me ...

  6. C# 设置系统环境变量

    using Microsoft.Win32; using System; using System.Collections.Generic; using System.ComponentModel; ...

  7. cookie和session的用法用途,执行流程,区别联系

    1.为什么要有cookie/session?在客户端浏览器向服务器发送请求,服务器做出响应之后,二者便会断开连接(一次会话结束).那么下次用户再来请求服务器,服务器没有任何办法去识别此用户是谁.比如w ...

  8. Java基础(十四)--装箱、拆箱详解

    Java中基本数据类型都有相对应的包装类 什么是装箱?什么是拆箱? 在Java SE5之前,Integer是这样初始化的 Integer i = new Integer(10); 而在从Java SE ...

  9. C#语言中循环分类总结

    C#语言中,循环主要分为4种,分别是:while循环.do while循环.for循环.foeach循环.下面我将分类对循环语句总结. 1.while循环: 如果循环条件为真,则执行循环体:执行完循环 ...

  10. sscanf,sprintf

    sprintf函数 sprintf函数原型为 int sprintf(char str, const char format, ...).作用是格式化字符串,具体功能如下所示: 将数字变量转换为字符串 ...