题目:

题意:将1~n的数进行m次操作,每次操作将第pi位到pi+si-1位的数字移到第一位,求最后的排列。

思路:现在还没不会写splay,在知道这是splay模板题后找了一波别人的模板,虽然过了,但是感觉自己没学到什么,过几天去学一波splay,再回来把这题重写一次~

代码实现如下:

 #include <map>
#include <set>
#include <cmath>
#include <ctime>
#include <stack>
#include <queue>
#include <cstdio>
#include <cctype>
#include <bitset>
#include <string>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <functional>
#include <bits/stdc++.h>
#define debug(x) cout<<"["<<x<<"]";
#define FIN freopen("input.txt","r",stdin);
#define FOUT freopen("output.txt","w+",stdout); inline int read() {//读入挂
int ret = , c, f = ;
for(c = getchar(); !(isdigit(c) || c == '-'); c = getchar());
if(c == '-')
f = -, c = getchar();
for(; isdigit(c); c = getchar())
ret = ret * + c - '';
if(f < )
ret = -ret;
return ret;
} const int MX = 1e5 + ;
const int INF = 0x3f3f3f3f; int size[MX];
int num[MX], col[MX], n, m;
int son[MX][], fa[MX], root, sz;
void Link(int x, int y, int c) {
fa[x] = y;
son[y][c] = x;
}
void push_up(int rt) {
size[rt] = size[son[rt][]] + size[son[rt][]] + ;
}
void push_down(int rt) {
if(col[rt]) {
col[son[rt][]] ^= ;
col[son[rt][]] ^= ;
int x = son[rt][];
son[rt][] = son[rt][];
son[rt][] = x;
col[rt] = ;
}
}
void Rotate(int x, int c) {
int y = fa[x];
push_down(y);
push_down(x);
Link(x, fa[y], son[fa[y]][] == y);
Link(son[x][!c], y, c);
Link(y, x, !c);
push_up(y);
} /*把节点x旋转到g的下面*/ void Splay(int x, int g) {
push_down(x); /*剪断[a,b]放到c后面*/
while(fa[x] != g) {
int y = fa[x], cx = son[y][] == x, cy = son[fa[y]][] == y;
if(fa[y] == g)
Rotate(x, cx);
else {
if(cx == cy)
Rotate(y, cy);
else
Rotate(x, cx);
Rotate(x, cy);
}
}
push_up(x);
if(!g)
root = x;
}
void NewNode(int f, int &rt) {
rt = ++sz;
fa[rt] = f, size[rt] = ;
son[rt][] = son[rt][] = col[rt] = ;
} /*把第k个找出来,放到g的下面*/ int Select(int k, int g) {
int rt = root;
while(size[son[rt][]] != k) {
if(size[son[rt][]] > k)
rt = son[rt][];
else
k -= size[son[rt][]] + , rt = son[rt][];
push_down(rt);
}
Splay(rt, g);
return rt;
}
void Build(int l, int r, int &rt, int f) {
if(l > r)
return;
int m = (l + r) >> , t;
NewNode(f, rt);
num[rt] = m;
Build(l, m - , son[rt][], rt);
Build(m + , r, son[rt][], rt);
push_up(rt);
}
void Prepare(int n) {
sz = ;
NewNode(, root);
num[] = ;
NewNode(root, son[root][]);
num[] = ;
Build(, n, son[][], );
Splay(, );
}
void Print(int rt, int &DFN) {
if(!rt)
return;
push_down(rt);
Print(son[rt][], DFN);
if(num[rt])
printf("%d%c", num[rt], ++DFN == n ? '\n' : ' ');
Print(son[rt][], DFN);
}
void Flip(int l, int r) {
Select(l - , );
Select(r + , root);
col[son[son[root][]][]] ^= ;
} void Cut(int a, int b, int c) {
Select(a - , ); /*平衡树操作*/
Select(b + , root);
int w = son[son[root][]][];
son[son[root][]][] = ;
Splay(son[root][], );
Select(c, );
Select(c + , root);
son[son[root][]][] = w;
Splay(son[root][], );
}
void NewNode(int f, int x, int &rt) {
rt = ++sz;
fa[rt] = f, size[rt] = ;
son[rt][] = son[rt][] = ;
num[rt] = x;
}
int Kth(int k) {
int rt = root;
while(size[son[rt][]] != k) {
if(size[son[rt][]] > k)
rt = son[rt][];
else
k -= size[son[rt][]] + , rt = son[rt][];
}
Splay(rt, );
return num[rt];
}
void Insert(int x) {
int rt = root;
while(true) {
int nxt = x > num[rt];
if(!son[rt][nxt]) {
NewNode(rt, x, son[rt][nxt]);
Splay(sz, );
return;
}
rt = son[rt][nxt];
}
} int main() {
while(~scanf("%d%d", &n, &m)) {
Prepare(n);
int x, y;
for(int i = ; i < m; i++) {
scanf("%d%d", &x, &y);
Cut(x, x + y - , );
}
int DFN = ;
Print(root, DFN);
}
return ;
}

Shuffle Cards(牛客第三场+splay)的更多相关文章

  1. 牛客第三场多校 E Sort String

    链接:https://www.nowcoder.com/acm/contest/141/E来源:牛客网 Eddy likes to play with string which is a sequen ...

  2. 牛客第三场多校 H Diff-prime Pairs

    链接:https://www.nowcoder.com/acm/contest/141/H来源:牛客网 Eddy has solved lots of problem involving calcul ...

  3. uestc summer training #9 牛客第三场 BFS计数

    G.coloring tree BFS计数 题目:给你n(<=5000)个节点的一颗树 你有K(<=5000)种颜色 你可以给每一个节点染一种颜色 总共有Kn种染色方法 在一种染色方法中 ...

  4. PACM Team(牛客第三场多校赛+dp+卡内存+打印路径)

    题目链接(貌似未报名的不能进去):https://www.nowcoder.com/acm/contest/141/A 题目: 题意:背包题意,并打印路径. 思路:正常背包思路,不过五维的dp很容易爆 ...

  5. 牛客第三场 J LRU management

    起初看到这道题的时候,草草就放过去了,开了另一道题,结果开题不顺利,总是感觉差一点就可以做出来,以至于一直到最后都没能看这道题qaq 题意:类似于操作系统上讲的LRU算法,有两个操作,0操作代表访问其 ...

  6. 最长相同01数的子串(map搞搞)--牛客第三场 -- Crazy Binary String

    题意: 如题. 或者用我的数组分治也可以,就是有点愚蠢. //#include <bits/stdc++.h> #include <map> #include <iost ...

  7. 平面割线平分点(构造)--牛客第三场-- Magic Line

    题意: 给你n个点的坐标,让你给出两个点,这两个点的连线可以平分这些点. 思路: 先按y的大小排序,在按x的小排序,再搞一下就行了.如下图: #include <bits/stdc++.h> ...

  8. 牛客第五场多校 J plan 思维

    链接:https://www.nowcoder.com/acm/contest/143/J来源:牛客网 There are n students going to travel. And hotel ...

  9. 牛客第五场 G max 思维

    链接:https://www.nowcoder.com/acm/contest/143/G来源:牛客网 Give two positive integer c, n. You need to find ...

随机推荐

  1. windows批处理学习(for和字符串)---03

    [1]for命令简介 先把for循环与for命令类比一下,这样学习理解快. for 循环语句,一般格式如下: 1 for (表达式1;表达式2;表达式3) 2 { 3 循环体; 4 } 1. 表达式1 ...

  2. 第一章 持续集成jenkins工具使用之部署

    1.1 硬件要求 内存:至少512MB 磁盘空间:10G JDK8 最好同时安装jre 从官网https://jenkins.io/download/下载最新的war包(Generic Java Pa ...

  3. Spring MVC架构浅析

    阅读目录 Spring MVC概述 Spring MVC框架的特点 Spring MVC工作原理 Spring MVC概述 Spring的web框架围绕DispatcherServlet设计,Disp ...

  4. 手机端浏览器适配,background 背景平铺 ,有的出不来

    .mobilePage .report { background: url(../images/mobile-report.png) repeat; background-size: 100% :/* ...

  5. 【Python】Python SQLAlchemy基本操作和常用技巧

    首先说下,由于最新的 0.8 版还是开发版本,因此我使用的是 0.79 版,API 也许会有些不同.因为我是搭配 MySQL InnoDB 使用,所以使用其他数据库的也不能完全照搬本文. 接着就从安装 ...

  6. Qt快速入门学习笔记(基础篇)

    本文基于Qter开源社区论坛版主yafeilinux编写的<Qt快速入门系列教程目录>,网址:http://bbs.qter.org/forum.php?mod=viewthread&am ...

  7. 求熵 python 代码

    #coding=gbk import nltk import math def entropy(labels): freqdist = nltk.FreqDist(labels) #Frequency ...

  8. CentOS LVM逻辑卷管理

    在CentOS 挂载(U盘NTFS格式,新硬盘,增加交换分区,扩展根分区等)中扩展根分区部分用的就是LVM逻辑卷管理来进行扩展的. 1.为什么会有逻辑卷管理 传统磁盘管理是直接对硬盘分区进行访问,你如 ...

  9. BZOJ4827:[AH2017/HNOI2017]礼物——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4827 https://www.luogu.org/problemnew/show/P3723 题面 ...

  10. 洛谷 P1966 火柴排队 解题报告

    P1966 火柴排队 题目描述 涵涵有两盒火柴,每盒装有 \(n\) 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: \(\s ...