今天打了牛客网的多校,有一道splay的题目发现别人用了300多的代码A了。。。震惊了,发现竟然有封装好的rope库...
赶紧学习一下,以后splay的题目就直接用库写了。。。这种数据结构真的懒得学。。。
主要参考自:rope讲解
命名空间:
using namespace __gnu_cxx;
头文件
#include<ext/rope>
新建:
rope<int>s;
函数:
append()
string &append(const string &s,int pos,int n);//把字符串s中从pos开始的n个字符连接到当前字符串的结尾
substr()
substr(l,k) 获得从第 l 位开始的长度为k的字符串 默认全字符串
length() size()
长度或大小
push_back(x)
末尾添加x
insert(pos,x)
pos插入x
erase(pos,x)
pos开始删除x个
copy(pos,k,x)
从pos开始到pos+k为止用x代替
replace(pos,x)
从pos开始换成x
substr(pos,x)
提取pos开始x个元素
at(x)/[x]
访问第x个元素
例题:
m次操作:
输入l r 将 l 后k个数添加到序列首部。
代码1:
#include<bits/stdc++.h>
#include<ext/rope>
using namespace std;
using namespace __gnu_cxx;
rope<int>s;
int main()
{
int n,m,k,l;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)s.push_back(i);
while(m--)
{
scanf("%d%d",&l,&k);
s=s.substr(l-1,k)+s.substr(0,l-1)+s.substr(l+k-1,n+1-k-l);
}
for(auto c:s)
printf("%d ",c);
puts("");
}
代码2:
#include<iostream>
#include<ext/rope>
using namespace std;
using namespace __gnu_cxx;
rope<int>a;
int main(){
int n,m,x,y;
cin>>n>>m;
for(int i=1;i<=n;i++){
a.push_back(i);
}
for(int i=0;i<m;i++){
cin>>x>>y;
a.insert(0,a.substr(x-1,y));
a.erase(x+y-1,y);
}
for(int i=0;i<n;i++){
if(i==0){
cout<<a[i];
}else{
cout<<" "<<a[i];
}
}
cout<<endl;
}