洛谷 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的同学们为了庆祝春节,准备排练一场舞会. 题目描述 在越来越讲究合作的时代,人们注意的更多的不是个人物的舞姿,而是集体的排列. 为了配合每年的倒计时,同学们决定排出——“数字舞蹈 ...
随机推荐
- (Nginx+Apache)实现反向代理与负载均衡
反向代理负载均衡 使用代理服务器可以将请求转发给内部的Web服务器,使用这种加速模式显然可以提升静态网页的访问速度.因此也可以考虑使用这种技术,让代理服务器将请求均匀转发给多台内部Web服务器之一上, ...
- Unity笔记(4)自学第六天
今天主要是写了demo的策划案 [关卡设计部分]: [关卡数值设计]:
- C#方法参数关键字
一.params关键字 prams告诉函数的调用者,该函数的参数数量是可变,如果调用函数的参数标识了params关键字,那么我们可以使用逗号分割的参数或者一个数组来作为参数: 1.这里只能是数组,Li ...
- 动态生成表格呈现还是将表格直接绑定gridview等控件呈现的开发方式选择依据
动态生成表格呈现还是将表格直接绑定gridview等控件呈现的开发方式选择依据:由存储过程决定,如果编写的存储过程可以生成需要呈现的表格则直接绑定,否则要动态生成表格
- 开放API接口
[开放API]——知乎.博客园等开放API接口(更新ing) Cnodejs.org: https://cnodejs.org/api/ 和风天气: http://docs.heweather.c ...
- ansible相关说明
2.ansible相关说明 2.1.ansible相关命令 ansible:定义并运行简单任务,主要执行ad-hoc命令 ansible-config:查看.编辑.管理ansible配置 ansibl ...
- 《BUG创造队》第五次作业:项目需求分析改进与系统设计
项目 内容 这个作业属于哪个课程 2016级软件工程 这个作业的要求在哪里 实验九 团队作业5-团队项目需求改进与系统设计 团队名称 BUG创造队 作业学习目标 1.编写完整<软件需求规格说明书 ...
- 解决 python No migrations to apply 无法生成表
第一步: 删除该app名字下的migrations文件. 第二步: 进入数据库,找到django_migrations的表,删除该app名字的所有记录. delete from django_migr ...
- vue 接口统一管理
在外部创建一个API文件夹,然后创建一个API.js 例如 const filmbanner = 'api/billboard/home?__t=1498823077473'; const film ...
- 计算几何——认识基本object:点、线、面 。
认识基本object:点.线.面 一.点 点用P(x, y)来表示:如: typedef pair<double, double> _pair; _pair point[MAXN]; 二 ...