1 条题解

  • 1
    @ 2025-1-7 20:30:09

    前置知识

    https://www.luogu.com/article/mtmz3rvx

    本题解法

    • 操作一,最多输 20 个数,可以直接遍历 rope。
    • 操作二,可以用 substr 进行拼接。
    • 操作三,参考「前置知识」提到的文章,用两个 rope 维护正反即可。移动到序列末尾直接截取就行了。但是要注意的是,做任何带有修改的操作时一定要同步更新正反 rope。
    • 操作四,还是可以用 substr 拼接。

    std:

    #include<bits/stdc++.h>
    #include<ext/rope>
    #define rep(i,a,b) for(int i(a);i<=(b);++i)
    #define req(i,a,b) for(int i(a);i>=(b);--i)
    using namespace std;
    char buf[1<<23],*p1=buf,*p2=buf,ubuf[1<<23],*u=ubuf;
    #define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
    template<typename TP> inline TP read(TP &num)
    {
    	TP x=0;
    	int f=0;
    	char ch=getchar();
    	while(ch<48||ch>57) f|=ch=='-',ch=getchar();
    	while(48<=ch&&ch<=57) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    	return num=f?-x:x;
    }
    template<typename ...Args> inline void read(Args &...args)
    {
    	(read(args),...);
    }
    template<typename TP> inline void write(TP x)
    {
    	(x<0)?(putchar('-'),x=-x):0;
    	(x>9)?(write(x/10),0):0;
    	putchar((x%10)^48);
    }
    template<typename TP> inline void writeln(TP x)
    {
    	write<TP>(x);
    	puts("");
    }
    using namespace __gnu_cxx;
    namespace Solve
    {
    	int n,q,opt,x,y,a[200001];
    	rope<int> tree,rtree;
    	inline void tree_reverse(int l,int r)
    	{
    		rope<int> tmp=tree.substr(tree.begin()+l,tree.begin()+r);
    		tree=tree.substr(tree.begin(),tree.begin()+l)+tree.substr(tree.begin()+r,tree.end())+rtree.substr(rtree.begin()+n-r,rtree.begin()+n-l);
    		rtree=tmp+rtree.substr(rtree.begin(),rtree.begin()+n-r)+rtree.substr(rtree.begin()+n-l,rtree.end());
    	}
    	inline void main()
    	{
    		read(n,q);
    		rep(i,1,n) read(a[i]),tree.append(a[i]);
    		req(i,n,1) rtree.append(a[i]);
    		rep(i,1,q)
    		{
    			read(opt,x,y);
    			if(opt==1)
    			{
    				rep(i,x-1,y-1) write(tree[i]),putchar(" \n"[i==y-1]);
    			}
    			else if(opt==4)
    			{
    				rope<int> treel=tree.substr(tree.begin(),tree.begin()+x-1),
    						  treer=tree.substr(tree.begin()+x,tree.end()),
    						  rtreel=rtree.substr(rtree.begin(),rtree.begin()+n-x),
    						  rtreer=rtree.substr(rtree.begin()+n-x+1,rtree.end());
    				tree=treel+y+treer,rtree=rtreel+y+rtreer;
    			}
    			else if(opt==3) tree_reverse(x-1,y);
    			else if(opt==2)
    			{
    				int ps=tree[x-1],pt=tree[y-1];
    				rope<int> treel=tree.substr(tree.begin(),tree.begin()+x-1),
    						  treem=tree.substr(tree.begin()+x,tree.begin()+y-1),
    						  treer=tree.substr(tree.begin()+y,tree.end()),
    						  rtreel=rtree.substr(rtree.begin(),rtree.begin()+n-y),
    						  rtreem=rtree.substr(rtree.begin()+n-y+1,rtree.begin()+n-x),
    						  rtreer=rtree.substr(rtree.begin()+n-x+1,rtree.end());
    				tree=treel+treem+pt+ps+treer,rtree=rtreel+ps+pt+rtreem+rtreer;
    			}
    		}
    		printf("Final sequence: ");
    		for(auto i:tree) write(i),putchar(32);
    	}
    }
    signed main()
    {
    	Solve::main();
    	return 0;
    }
    

    若想测试较强的完整数据,请在洛谷查看本题:https://www.luogu.com.cn/problem/T442649

    信息

    ID
    105
    时间
    15000ms
    内存
    512MiB
    难度
    8
    标签
    递交数
    18
    已通过
    3
    上传者