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 ...
随机推荐
- TCP系列31—窗口管理&流控—5、TCP流控与滑窗
一.TCP流控 之前我们介绍过TCP是基于窗口的流量控制,在TCP的发送端会维持一个发送窗口,我们假设发送窗口的大小为N比特,网络环回时延为RTT,那么在网络状况良好没有发生拥塞的情况下,发送端每个R ...
- Web界面和Winform界面生成,代码生成工具
在上面一篇随笔<代码生成工具之界面快速生成>介绍了代码生成工具Database2Sharp的界面生成操作,其中介绍了Web界面(包括列表界面.内容显示.内容编辑界面的生成,另外还介绍了Wi ...
- JAVA IDE IntelliJ IDEA使用简介(二)—之基本操作
一.在编辑器中打开文件 1.可以使用下面的几种方式打开project内的文件进行编辑 (·)在project窗口中双击需要编辑的文件. (·)在project窗口选择需要编辑的文件,按F4 ( ...
- JavaScript 语句标识符,变量周期,常见的HTML事件
语句 描述 break 用于跳出循环. catch 语句块,在 try 语句块执行出错时执行 catch 语句块. continue 跳过循环中的一个迭代. do ... while 执行一个语句块, ...
- sqlserver修改sa密码(在windows登陆没有权限的情况下)
对于windows用户没有权限执行alter login sa enable的情况下,采用如下方法可以成功修改sa密码登陆. . 用Run as a administrator打开命令提示符里输入NE ...
- 关于__name__=='__main__
if __name__=='__main__' : 为了区分你是主动执行这个脚本,还是从别的地方把它当做一个模块去调用. 如果是主动执行,则执行.如果是调用的,则不执行主体. 里面存放的可能是一些测 ...
- 进程池-限制同一时间在CPU上运行的进程数
if __name__=='__main__' : 为了区分你是主动执行这个脚本,还是从别的地方把它当做一个模块去调用. 如果是主动执行,则执行.如果是调用的,则不执行主体. 1. 串行:切记切记: ...
- Springboot @Transactional 事务不回滚
一.异常捕获的原因 这里Exception异常,他又分为运行时异常RuntimeException和非运行时异常 可查的异常(checked exceptions):Exception下除了Runti ...
- [JLOI2014]松鼠的新家 树上差分
差分 一开始竟然想分情况讨论来差分,然后发现各自情况要分析, 就是为了解决中间节点重复计算的问题, 结果 最后一想,中间重复计算了一次,那我最后减掉不就好了么,,, 那这就是一道差分裸题了(这是唯一不 ...
- LOJ6342::跳一跳——题解
https://loj.ac/problem/6342 f[i]表示从i开始跳的期望时间,f[n]=0. 所以f[i]=(f[i]+f[i+1]+……+f[n])/(n-i+1)+1. 移项整理可求f ...