1 条题解

  • 0
    @ 2025-8-24 22:05:29

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 7KByte
    **

    搬运于2025-08-24 22:05:29,当前版本为作者最后更新于2019-03-17 13:49:43,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    UpdataUpdata发现打错了几个符号和字……

    上一篇唯一的题解涉嫌抄袭被DeleteDelete了(考古
    那我来补一篇


    先扯一句,题面说什么无效操作,事实上没有(弄的我多打了100行……

    从题面透露出的信息我们可以感受到这题是个大型模拟

    看到目前的提交大多数是栈和链表
    然而本蒟蒻并不会,所以就打了一个双端队列(模拟栈)+启发式合并

    除了MOVEMOVE操作,其他操作还是比较简单吧……按照题意打就可以了

    对于MOVEMOVE操作我们进行启发式合并,因为最多有10610^6次操作,如果按照题意暴力合并复杂度能够达到O(N2)O(N^2),而启发式合并能够保证复杂度为O(Nlog2N)O(N log_2 N)

    我们开两个双端队列模拟栈,最初队首为栈,队尾为栈,前面四个操作直接在队尾执行,每次复杂度O(1)O(1)

    对于第5个操作DELDEL,直接暴力讲队列清空,每次复杂度O(n)O(n),均摊复杂度O(1)O(1)

    对于第7个操作SWAPSWAP,我们记录f0f_0f1f_1,表示输入的xx号栈对应的是第fxf_x号队列,操作时直接讲f0f_0f1f_1 SWAPSWAP即可,注意,f0f1f_0 f_1一定要分别置初值0,1{0,1},每次复杂度O(1)O(1)

    对于毒瘤的第6个操作MOVEMOVE,我们考虑两种情况(注意,题目要求将YY栈移动到XX栈):


    • YY栈小于XX栈时,直接暴力将YY栈里的元素移到XX栈里

    • YY栈大于XX
      我们借助Tag0Tag1Tag_0\text{和}Tag_1表示这个队列是否反转,即队头变队尾,队尾变队头,初始化都为零,表示没有反转
      我们将XX栈里的元素按照出栈顺序一一移动到YY
      然后再将TagY XOR  1Tag_Y\ XOR\ \ 1,因为两次反转则等于没有反转
      最后SWAP(fx,fy)SWAP(f_x,f_y)
      为什么这样是对的,因为将YY栈移动到XX栈正好是将XX栈移动到YY栈的反转序列,自己画个图就知道了

    每次复杂度O(n)O(n),均摊复杂度O(log2N)O(log_2N)


    Code:Code: O(Nlog2N)O(N log_2 N)

    #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;
    }
    
    • 1

    信息

    ID
    3927
    时间
    3000ms
    内存
    500MiB
    难度
    4
    标签
    递交数
    0
    已通过
    0
    上传者