洛谷 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的同学们为了庆祝春节,准备排练一场舞会. 题目描述 在越来越讲究合作的时代,人们注意的更多的不是个人物的舞姿,而是集体的排列. 为了配合每年的倒计时,同学们决定排出——“数字舞蹈 ...
随机推荐
- poj3662 Telephone Lines
思路: 二分+最短路.最短路也可以用来计算从a到达b所需的边权不超过x的边的数量. 实现: #include <cstdio> #include <cmath> #includ ...
- elasticsearch学习笔记-倒排索引以及中文分词
我们使用数据库的时候,如果查询条件太复杂,则会涉及到很多问题 1.无法维护,各种嵌套查询,各种复杂的查询,想要优化都无从下手 2.效率低下,一般语句复杂了之后,比如使用or,like %,,%查询之后 ...
- 迅为I.MX6Q开发板配不同分辨率不同尺寸液晶屏幕
I.MX6Q开发板: 核心板参数 尺寸:51mm*61mm iMX6Q四核CPU:Freescale Cortex-A9 四核 i.MX6Q,主频 1.2 GHz iMX6DL双核CPU:Freesc ...
- CREATE OPERATOR - 定义一个新的操作符
SYNOPSIS CREATE OPERATOR name ( PROCEDURE = funcname [, LEFTARG = lefttype ] [, RIGHTARG = righttype ...
- CAD参数绘制圆弧(com接口)
在CAD设计时,需要绘制圆弧,用户可以在图面点圆弧起点,圆弧上的一点和圆弧的终点,这样就绘制出圆弧. 主要用到函数说明: _DMxDrawX::DrawArc2 由圆弧上的三点绘制一个圆弧.详细说明如 ...
- js 发送短信验证码倒计时
html <input type="button" id="btn" value="免费获取验证码" onclick="se ...
- JavaSE-24 多线程
学习要点 线程概述 Java中的多线程 线程状态 线程调度 线程同步 线程间通信 线程概述 1 进程 进程就是应用程序的执行实例. 进程特征: 动态性:动态产生,动态消亡.进程启动,系统为其分配资源 ...
- PHP 下基于 php-amqp 扩展的 RabbitMQ 简单用例 (四) -- Push API 和 Pull API
RabbitMQ 中针对消息的分发提供了 Push API (订阅模式) 和 Pull API (主动获取) 两种模式. 在 PHP 中, 这两种模式分别通过 AMQPQueue 类中的 consum ...
- IDEA、Eclipse快捷键对比
IDEA.Eclipse快捷键对比 序号 功能 IDEA Eclipse 1 很多功能:导入包,处理异常,强转cast Alt+Enter 2 导入包,自动修正??? Ctrl+Enter 3 ...
- BZOJ 1711 吃饭dining/Luogu P1402 酒店之王 拆点+最大流流匹配
题意: (吃饭dining)有F种食物和D种饮料,每种食物或饮料只能供一头牛享用,且每头牛只享用一种食物和一种饮料.现在有n头牛,每头牛都有自己喜欢的食物种类列表和饮料种类列表,问最多能使几头牛同时享 ...