1 条题解
-
1
前置知识
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
- 上传者