题意:初始给一个 1,2,3……,n的序列,然后之后给q个操作
每一个操作给一组 l,s 要求把 从l个位置开始的s个数组拿出来拼到序列开头
比如 n=5, 进行一次 2 3操作
就把 1,2,3,4,5 变成了 2,3,4,1,5
解法: 比赛的时候写了个链表T了。。。。。。。。
一种方法是用平衡树,每次把树拆成3部分再重新组合
另一种方法是用分块链表
然后就是神奇的STL出现了。。。。。。。
c++里 可以用rope容器 ,本身就是封装了分块链表
具体使用百度orz
头文件
#include<ext/rope>
using namespace __gnu_cxx;
rope<int> a;
rope支持加法运算操作
具体的看:https://blog.csdn.net/piaocoder/article/details/48720007
#include<bits/stdc++.h>
#include<ext/rope>
using namespace std;
using namespace __gnu_cxx;
rope<int>ans;
int n,m,l,r;
int main(){
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)ans+=i;
for (int i=1;i<=m;i++)
{ scanf("%d%d",&l,&r);
l--;
if (l==0)continue;
ans=ans.substr(l,r)+ans.substr(0,l)+ans.substr(l+r,n-r-l);
}
printf("%d",ans[0]);
for (int i=1;i<n;i++)
printf(" %d",ans[i]);
printf("\n");
return 0;
}