Shuffle Cards(牛客第三场+splay)
题目:


题意:将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)的更多相关文章
- 牛客第三场多校 E Sort String
链接:https://www.nowcoder.com/acm/contest/141/E来源:牛客网 Eddy likes to play with string which is a sequen ...
- 牛客第三场多校 H Diff-prime Pairs
链接:https://www.nowcoder.com/acm/contest/141/H来源:牛客网 Eddy has solved lots of problem involving calcul ...
- uestc summer training #9 牛客第三场 BFS计数
G.coloring tree BFS计数 题目:给你n(<=5000)个节点的一颗树 你有K(<=5000)种颜色 你可以给每一个节点染一种颜色 总共有Kn种染色方法 在一种染色方法中 ...
- PACM Team(牛客第三场多校赛+dp+卡内存+打印路径)
题目链接(貌似未报名的不能进去):https://www.nowcoder.com/acm/contest/141/A 题目: 题意:背包题意,并打印路径. 思路:正常背包思路,不过五维的dp很容易爆 ...
- 牛客第三场 J LRU management
起初看到这道题的时候,草草就放过去了,开了另一道题,结果开题不顺利,总是感觉差一点就可以做出来,以至于一直到最后都没能看这道题qaq 题意:类似于操作系统上讲的LRU算法,有两个操作,0操作代表访问其 ...
- 最长相同01数的子串(map搞搞)--牛客第三场 -- Crazy Binary String
题意: 如题. 或者用我的数组分治也可以,就是有点愚蠢. //#include <bits/stdc++.h> #include <map> #include <iost ...
- 平面割线平分点(构造)--牛客第三场-- Magic Line
题意: 给你n个点的坐标,让你给出两个点,这两个点的连线可以平分这些点. 思路: 先按y的大小排序,在按x的小排序,再搞一下就行了.如下图: #include <bits/stdc++.h> ...
- 牛客第五场多校 J plan 思维
链接:https://www.nowcoder.com/acm/contest/143/J来源:牛客网 There are n students going to travel. And hotel ...
- 牛客第五场 G max 思维
链接:https://www.nowcoder.com/acm/contest/143/G来源:牛客网 Give two positive integer c, n. You need to find ...
随机推荐
- lintcode-186-最多有多少个点在一条直线上
186-最多有多少个点在一条直线上 给出二维平面上的n个点,求最多有多少点在同一条直线上. 样例 给出4个点:(1, 2), (3, 6), (0, 0), (1, 3). 一条直线上的点最多有3个. ...
- (五)final修饰符
final修饰变量 final修饰符一般用于基本数据类型(int,float)或者不可变对象(String).这时候可以看作常量变量. 但是当final作用于可变数据类型时(数组,一般对象),仅仅表示 ...
- iOS-修改导航栏文字字体和颜色
//修改导航栏文字字体和颜色 nav.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName:[RGBColor co ...
- bootstrap列表添加滚动条
有时候列表中数据过多,导致超出页面,影响视觉感受.这时我们需要添加一个滚动条. 初始状态如图: 代码如下: <ul class="list-group"> <li ...
- JavaScript Array 类型
除 Object类型外,Array 类型算是ECMAScript中最常用的类型了,而且,ECMAScript中的数组和其他多数语言的数组有着非常大的差别,虽然这些数组都是数据的有序列表,但与其他语言不 ...
- matlab eval【转】
Matlab 简单谈谈EVAL函数的用法 EVAL(s)相当于把字符串s的内容作为语句来执行. 比如:eval('a=3*5') 和直接在command 窗口中输入 a=3*5 等效 eval 一个经 ...
- POJ3177:Redundant Paths——题解
http://poj.org/problem?id=3177 明显要求桥的一道题. (因为有桥就说明只能从那一条路走,换句话说就是只有一种方法) 求完桥后按照结论(加几条边成双连通图的结论,不会请ba ...
- React中的高阶组件,无状态组件,PureComponent
1. 高阶组件 React中的高阶组件是一个函数,不是一个组件. 函数的入参有一个React组件和一些参数,返回值是一个包装后的React组件.相当于将输入的React组件进行了一些增强.React的 ...
- 34张史上最全IT架构师技术知识图谱 最新下载
本文是笔者多年来积累和收集的知识技能图谱,小编极力推荐分享给身边的技术人儿,希望这份技术知识图谱能够帮助到每一位奋斗在技术路上的小伙伴. 下面是笔者多年来积累和收集的知识技能图谱,有的是笔者原创总结的 ...
- Json对象转为实体对象
Json对象转为实体对象 1.Bean中申明 trainTypeList: public class TrainTypeQueryParam implements Serializable { pri ...