洛谷 U41572 Portal2
题目背景
某地ENLIGHTENED
的XM
研究所正在研究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
根据指令描述输出栈内元素。
输入输出样例
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
SUCCESS
SUCCESS
SUCCESS
SUCCESS
SUCCESS
SUCCESS
SUCCESS
SUCCESS
UNSUCCESS
SUCCESS
150 30 20 10
NONE
PUSH 0 10
PUSH 0 20
PUSH 0 30
PUSH 0 40
PUSH 1 50
PUSH 1 60
MOVE 0 1
END
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$
/*
最暴力的模拟思路了 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的更多相关文章
- [洛谷P4940]Portal2
题目大意:维护两个栈,几个操作: $PUSH\;x\;num:$把$num$压入栈$x$ $POP\;x:$弹出栈$x$栈顶元素 $ADD\;x:$取出两个栈栈顶,把相加值压入栈$x$ $SUB\;x ...
- 『题解』洛谷P1063 能量项链
原文地址 Problem Portal Portal1:Luogu Portal2:LibreOJ Portal3:Vijos Description 在\(Mars\)星球上,每个\(Mars\)人 ...
- 洛谷1640 bzoj1854游戏 匈牙利就是又短又快
bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...
- 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.
没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...
- 洛谷P1108 低价购买[DP | LIS方案数]
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
- 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP
题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...
- 洛谷P1710 地铁涨价
P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交 讨论 题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ...
- 洛谷P1371 NOI元丹
P1371 NOI元丹 71通过 394提交 题目提供者洛谷OnlineJudge 标签云端评测 难度普及/提高- 提交 讨论 题解 最新讨论 我觉得不需要讨论O long long 不够 没有取 ...
- 洛谷P1538迎春舞会之数字舞蹈
题目背景 HNSDFZ的同学们为了庆祝春节,准备排练一场舞会. 题目描述 在越来越讲究合作的时代,人们注意的更多的不是个人物的舞姿,而是集体的排列. 为了配合每年的倒计时,同学们决定排出——“数字舞蹈 ...
随机推荐
- hihocoder offer收割编程练习赛12 B 一面砖墙
思路: 就是求哪个长度出现的次数最多. 实现: #include <iostream> #include <cstdio> #include <algorithm> ...
- Vue.js学习笔记--2.基础v-指令
整理自官网教程 -- https://cn.vuejs.org/ 1. v-bind绑定Class与Style a. 绑定Class 语法:v-bind:class="{classname: ...
- Unity笔记(4)自学第六天
今天主要是写了demo的策划案 [关卡设计部分]: [关卡数值设计]:
- android手机web网站拨打电话几种方式
1. <input name="phone" format="*m" value="13"/> <do type=&quo ...
- Swift Intermediate Language (SIL)
Swift Intermediate Language (SIL) https://github.com/apple/swift/blob/master/docs/SIL.rst#witness-me ...
- C# 设置系统环境变量
using Microsoft.Win32; using System; using System.Collections.Generic; using System.ComponentModel; ...
- cookie和session的用法用途,执行流程,区别联系
1.为什么要有cookie/session?在客户端浏览器向服务器发送请求,服务器做出响应之后,二者便会断开连接(一次会话结束).那么下次用户再来请求服务器,服务器没有任何办法去识别此用户是谁.比如w ...
- Java基础(十四)--装箱、拆箱详解
Java中基本数据类型都有相对应的包装类 什么是装箱?什么是拆箱? 在Java SE5之前,Integer是这样初始化的 Integer i = new Integer(10); 而在从Java SE ...
- C#语言中循环分类总结
C#语言中,循环主要分为4种,分别是:while循环.do while循环.for循环.foeach循环.下面我将分类对循环语句总结. 1.while循环: 如果循环条件为真,则执行循环体:执行完循环 ...
- sscanf,sprintf
sprintf函数 sprintf函数原型为 int sprintf(char str, const char format, ...).作用是格式化字符串,具体功能如下所示: 将数字变量转换为字符串 ...