首页 > 其他 > 详细

2018牛客网暑期ACM多校训练营(第三场)C Shuffle Cards(可持久化平衡树/splay)

时间:2018-07-28 10:16:38      阅读:243      评论:0      收藏:0      [点我收藏+]

题意

牌面初始是1到n,进行m次洗牌,每次抽取一段放到最前面。求最后的序列。

分析

神操作!!!比赛时很绝望,splay技能尚未点亮,不知道怎么用。

殊不知,C++库里有rope神器,即块状链表。

基础函数

#include <ext/rope>
using namespace __gnu_cxx;

rope test;

test.push_back(x);//在末尾添加x
test.insert(pos,x);//在pos插入x  
test.erase(pos,x);//从pos开始删除x个
test.copy(pos,len,x);//从pos开始到pos+len为止用x代替
test.replace(pos,x);//从pos开始换成x
test.substr(pos,x);//提取pos开始x个
test.at(x)/[x];//访问第x个元素

有了上面的函数,就解决这道题了(狗头。

#include<iostream>
#include<cmath>
#include<cstring>
#include<queue>
#include<vector>
#include<cstdio>
#include<algorithm>
#include<map>
#include<set>
#include<ext/rope>
#define rep(i,e) for(int i=0;i<(e);i++)
#define rep1(i,e) for(int i=1;i<=(e);i++)
#define repx(i,x,e) for(int i=(x);i<=(e);i++)
#define X first
#define Y second
#define PB push_back
#define MP make_pair
#define mset(var,val) memset(var,val,sizeof(var))
#define scd(a) scanf("%d",&a)
#define scdd(a,b) scanf("%d%d",&a,&b)
#define scddd(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define pd(a) printf("%d\n",a)
#define scl(a) scanf("%lld",&a)
#define scll(a,b) scanf("%lld%lld",&a,&b)
#define sclll(a,b,c) scanf("%lld%lld%lld",&a,&b,&c)
#define IOS ios::sync_with_stdio(false);cin.tie(0)
#define lc idx<<1
#define rc idx<<1|1
#define rson mid+1,r,rc
#define lson l,mid,lc

using namespace std;
typedef long long ll;
int read() {
    int x = 0;
    char c = getchar();
    while (c < 0 || c > 9)c = getchar();
    while (c >= 0 && c <= 9) {
        x = x * 10 + c - 0;
        c = getchar();
    }
    return x;
}
template <class T>
void test(T a){cout<<a<<endl;}
template <class T,class T2>
void test(T a,T2 b){cout<<a<<" "<<b<<endl;}
template <class T,class T2,class T3>
void test(T a,T2 b,T3 c){cout<<a<<" "<<b<<" "<<c<<endl;}
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3fll;
const ll mod = 1e9+7;
int T;
void testcase(){
    printf("Case %d: ",++T);
}
const int MAXN = 1e5+10;
const int MAXM = 30;
const double eps = 1e-9;
using namespace __gnu_cxx;

int main() {
#ifdef LOCAL
    freopen("in.txt","r",stdin);
#endif // LOCAL
    int n,m;
    n=read();m=read();
    rope<int> ro;
    for(int i=1;i<=n;i++) ro.push_back(i);
    int x,y;
    while(m--){
        x=read();y=read();
        ro=ro.substr(x-1,y)+ro.substr(0,x-1)+ro.substr(y+x-1,n-x-y+1);
    }
    for(int i=0;i<n;i++){
        printf("%d%c",ro[i],(i==n-1?\n: ));
        
    }
    return 0;
}

 

2018牛客网暑期ACM多校训练营(第三场)C Shuffle Cards(可持久化平衡树/splay)

原文:https://www.cnblogs.com/fht-litost/p/9380327.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!