题解 P4940 【Portal2】
我们开两个双端队列模拟栈,最初队首为栈底,队尾为栈顶,前面四个操作直接在队尾执行,每次复杂度
对于第5个操作
对于第7个操作
对于毒瘤的第6个操作
- 当
Y 栈小于X 栈时,直接暴力将Y 栈里的元素移到X 栈里
- 当
Y 栈大于X 栈
我们借助Tag_0\text{和}Tag_1 表示这个队列是否反转,即队头变队尾,队尾变队头,初始化都为零,表示没有反转
我们将X 栈里的元素按照出栈顺序一一移动到Y 栈
然后再将Tag_Y\ XOR\ \ 1 ,因为两次反转则等于没有反转
最后SWAP(f_x,f_y)
为什么这样是对的,因为将Y 栈移动到X 栈正好是将X 栈移动到Y 栈的反转序列,自己画个图就知道了
每次复杂度
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
deque<ll>q[2];
int f[2]={0,1};
int tag[2]={0,0};
int main()
{
char k[10];int x,y;ll X,Y;
while(true){
scanf("%s",k);
if(k[0]=='P'&&k[1]=='O'){
scanf("%d",&x);
if(!q[f[x]].size()){
puts("UNSUCCESS");
}
else{
puts("SUCCESS");
if(tag[f[x]]){
q[f[x]].pop_front();
}
else q[f[x]].pop_back();
}
}
else if(k[0]=='P'&&k[1]=='U'){
scanf("%d%lld",&x,&Y);
puts("SUCCESS");
if(tag[f[x]]){
q[f[x]].push_front(Y);
}
else q[f[x]].push_back(Y);
}
else if(k[0]=='A'&&k[1]=='D'){
scanf("%d",&x);
if(!q[0].size()||!q[1].size()){
puts("UNSUCCESS");
}
else{
puts("SUCCESS");
ll a,b;
if(tag[0])a=q[0].front(),q[0].pop_front();
else a=q[0].back(),q[0].pop_back();
if(tag[1])b=q[1].front(),q[1].pop_front();
else b=q[1].back(),q[1].pop_back();
if(tag[f[x]]){
q[f[x]].push_front(a+b);
}
else{
q[f[x]].push_back(a+b);
}
}
}
else if(k[0]=='S'&&k[1]=='U'){
scanf("%d",&x);
if(!q[0].size()||!q[1].size()){
puts("UNSUCCESS");
}
else{
puts("SUCCESS");
ll a,b;
if(tag[0])a=q[0].front(),q[0].pop_front();
else a=q[0].back(),q[0].pop_back();
if(tag[1])b=q[1].front(),q[1].pop_front();
else b=q[1].back(),q[1].pop_back();
if(tag[f[x]]){
q[f[x]].push_front(abs(a-b));
}
else{
q[f[x]].push_back(abs(a-b));
}
}
}
else if(k[0]=='D'&&k[1]=='E'){
scanf("%d",&x);
puts("SUCCESS");
tag[f[x]]=0;
while(q[f[x]].size())q[f[x]].pop_back();
}
else if(k[0]=='M'&&k[1]=='O'){
scanf("%d%d",&x,&y);
puts("SUCCESS");
if(q[f[x]].size()<q[f[y]].size()){
while(q[f[x]].size()){
ll a;
if(tag[f[x]])a=q[f[x]].front(),q[f[x]].pop_front();
else a=q[f[x]].back(),q[f[x]].pop_back();
if(tag[f[y]])q[f[y]].push_front(a);
else q[f[y]].push_back(a);
}
tag[f[y]]^=1;
swap(f[0],f[1]);
}
else{
while(q[f[y]].size()){
ll a;
if(tag[f[y]])a=q[f[y]].front(),q[f[y]].pop_front();
else a=q[f[y]].back(),q[f[y]].pop_back();
if(tag[f[x]])q[f[x]].push_front(a);
else q[f[x]].push_back(a);
}
}
}
else if(k[0]=='S'&&k[1]=='W'){
swap(f[0],f[1]);puts("SUCCESS");
}
else if(k[0]=='E'&&k[1]=='N'){
puts("SUCCESS");
if(!q[f[0]].size())puts("NONE");
else {
if(tag[f[0]]){
while(q[f[0]].size())
printf("%lld ",q[f[0]].front()),q[f[0]].pop_front();
}
else{
while(q[f[0]].size())
printf("%lld ",q[f[0]].back()),q[f[0]].pop_back();
}
puts("");
}
if(!q[f[1]].size())puts("NONE");
else {
if(tag[f[1]]){
while(q[f[1]].size())
printf("%lld ",q[f[1]].front()),q[f[1]].pop_front();
}
else{
while(q[f[1]].size())
printf("%lld ",q[f[1]].back()),q[f[1]].pop_back();
}
puts("");
}
break;
}
}
return 0;
}