今天打了牛客網的多校,有一道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;
}