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 ...
随机推荐
- ACM 第四天
A - 最短路 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的 ...
- Swift-闭包理解(二)
简明扼要的闭包表达式 其实Swift已经为我们提供了很多简化的语法,可以让我们保证代码的高可读性和维护性.还用上面的例子来说明,对于 greetPeople 这个全局函数来说,其实只需要使用一次,所 ...
- 转 【关于api-ms-win-crt-runtimel1-1-0.dll缺失的解决方案】
关于api-ms-win-crt-runtimel1-1-0.dll缺失的解决方案 目录 关于api-ms-win-crt-runtimel1-1-0dll缺失的解决方案 目录 安装VC redite ...
- js设计模式之代理模式以及订阅发布模式
为啥将两种模式放在一起呢?因为这样文章比较长啊. 写博客的目的我觉得首要目的是整理自己的知识点,进而优化个人所得知识体系.知识成为个人的知识,就在于能够用自己的话表达同一种意义. 本文是设计模式系列文 ...
- navicat for mysql 10.1.7 注册码
NAVN-LNXG-XHHX-5NOO名:组织:注册码:均为NAVN-LNXG-XHHX-5NOO 下载地址:http://www.cr173.com/soft/38153.html
- [CLR via C#]基元类型
一.什么是基元类型 某些数据类型如此常用,以至于许多编译器允许代码以简化的语法来操纵它们.例如,可以使用以下语法来分配一个整数: System.Int32 a = new System.Int32() ...
- Code Quality
Code Quality https://www.sonarqube.org/ java https://www.sonarsource.com/products/codeanalyzers/sona ...
- ASP.Net MVC+Ibaties架构
1.配置Ibaties首先在DLL引用中添加Ibaties相关引用:IBatisNet.Common.dll;IBatisNet.Common.Logging.Log4Net.dll;IBatisNe ...
- Codeforces Round #521 Div. 3 玩耍记
A:签到. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> ...
- 【刷题】SPOJ 1812 LCS2 - Longest Common Substring II
A string is finite sequence of characters over a non-empty finite set Σ. In this problem, Σ is the s ...