Portal2

题目背景

某地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

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1000006;
string s;
int h[2],pre[MAXN],nxt[MAXN],tot=2;
long long w[MAXN];
inline void add(int u,int v)
{
	nxt[u]=v;
	pre[v]=u;
}
inline long long pop(int x)
{
	add(pre[x],nxt[x]);
	return w[x];
}
inline void push(int x,long long num)
{
	w[++tot]=num;
	if(x==0){
		add(pre[2],tot);
		add(tot,2);
	}
	else{
		add(tot,nxt[2]);
		add(2,tot);
	}
}
int main()
{
	ios::sync_with_stdio(false);
	int i,j,x,y,pos;
	long long num;
	h[0]=0;h[1]=1;
	add(0,2);
	add(2,1);
	cin>>s;
	while(s!="END"){
		if(s=="PUSH"){
			cout<<"SUCCESS"<<endl;
			cin>>x>>num;
			x=h[x];
			push(x,num);
		}
		else if(s=="POP"){
			cin>>x;
			x=h[x];
			if(x==0){
				if(pre[2]==0) cout<<"UNSUCCESS"<<endl;
				else{
					pop(pre[2]);
					cout<<"SUCCESS"<<endl;
				}
			}
			else{
				if(nxt[2]==1) cout<<"UNSUCCESS"<<endl;
				else{
					pop(nxt[2]);
					cout<<"SUCCESS"<<endl;
				}
			}
		}
		else if(s=="ADD"){
			cin>>x;
			x=h[x];
			if(pre[2]==0||nxt[2]==1) cout<<"UNSUCCESS"<<endl;
			else{
				cout<<"SUCCESS"<<endl;
				push(x,pop(pre[2])+pop(nxt[2]));
			}
		}
		else if(s=="SUB"){
			cin>>x;
			x=h[x];
			if(pre[2]==0||nxt[2]==1) cout<<"UNSUCCESS"<<endl;
			else{
				cout<<"SUCCESS"<<endl;
				push(x,abs(pop(pre[2])-pop(nxt[2])));
			}
		}
		else if(s=="DEL"){
			cout<<"SUCCESS"<<endl;
			cin>>x;
			x=h[x];
			if(x==0) add(0,2);
			else add(2,1); 
		}
		else if(s=="MOVE"){
			cout<<"SUCCESS"<<endl;
			cin>>x>>y;
			x=h[x];y=h[y];
			add(pre[2],nxt[2]);
			if(x==0){
				add(pre[1],2);
				add(2,1);
			}
			else{
				add(2,nxt[0]);
				add(0,2);
			}
		}
		else if(s=="SWAP"){
			cout<<"SUCCESS"<<endl;
			swap(h[0],h[1]);
		}
		cin>>s;
	}
	cout<<"SUCCESS"<<endl;
	if(h[0]==0){
		pos=pre[2];
		if(pos==0) cout<<"NONE"<<endl;
		else{
			while(pos!=0){
				cout<<w[pos]<<" ";
				pos=pre[pos];
			}
			cout<<endl;
		}
		pos=nxt[2];
		if(pos==1) cout<<"NONE"<<endl;
		else{
			while(pos!=1){
				cout<<w[pos]<<" ";
				pos=nxt[pos];
			}
			cout<<endl;
		}
	}
	else{
		pos=nxt[2];
		if(pos==1) cout<<"NONE"<<endl;
		else{
			while(pos!=1){
				cout<<w[pos]<<" ";
				pos=nxt[pos];
			}
			cout<<endl;
		}
		pos=pre[2];
		if(pos==0) cout<<"NONE"<<endl;
		else{
			while(pos!=0){
				cout<<w[pos]<<" ";
				pos=pre[pos];
			}
			cout<<endl;
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/MrTinTin/article/details/83242218