2018牛客多校第三场 C.Shuffle Cards
题意:
给出一段序列,每次将从第p个数开始的s个数移到最前面。求最终的序列是什么。
题解:
Splay翻转模板题。存下板子。
#include <bits/stdc++.h>
using namespace std;
const int INF = 1e6;
const int N = 1e5+;
int n, m;
int s, t;
int root, sz, tot;
int key[N], f[N], size[N], delta[N], cnt[N], ch[N][];
int a[N], ans[N];
int get(int x) {
return ch[f[x]][] == x;
}
void update(int x) {
if(x) {
size[x] = cnt[x];
if(ch[x][]) size[x] += size[ch[x][]];
if(ch[x][]) size[x] += size[ch[x][]];
}
}
int build(int l, int r, int fa) {
if (l > r) return ;
int mid = l+r>>;
int now = ++sz;
key[now] = a[mid]; f[now] = fa; cnt[now] = ;
int lch = build(l, mid-, now);
int rch = build(mid+, r, now);
ch[now][] = lch, ch[now][] = rch;
update(now);
return now;
}
void pushdown(int x) {
if(x && delta[x]) {
swap(ch[x][], ch[x][]);
delta[ch[x][]] ^= ; delta[ch[x][]] ^= ;
delta[x] = ;
}
}
void rotate(int x) {
pushdown(f[x]);
pushdown(x);
int old = f[x], oldf = f[old], which = get(x);
ch[old][which] = ch[x][which^]; f[ch[old][which]] = old;
f[old] = x; ch[x][which^] = old;
f[x] = oldf;
if(oldf) ch[oldf][ch[oldf][]==old] = x;
update(old); update(x);
}
void splay(int x, int tar) {
for(int fa; (fa = f[x])!=tar; rotate(x))
if(f[fa] != tar)
rotate((get(x)==get(fa))?fa:x);
if(!tar) root = x;
}
int find(int x) {
int now = root, fa = ;
while() {
pushdown(now);
if(x <= size[ch[now][]])
now = ch[now][];
else {
x -= size[ch[now][]]+;
if(x == ) return now;
now = ch[now][];
}
}
}
void print(int now) {
pushdown(now);
if(ch[now][]) print(ch[now][]);
if(key[now]!=-INF && key[now]!=INF) ans[++tot] = key[now];
if(ch[now][]) print(ch[now][]);
}
int main() {
scanf("%d%d", &n, &m);
a[] = -INF; a[n+] = INF;
for(int i = ; i <= n+; i++) a[i] = i-;
root = build(, n+, );
while(m--) {
scanf("%d%d", &s, &t);
if(s == ) continue;
int f1 = find();
int f2 = find(s+t+);
splay(f1, );
splay(f2, f1);
delta[ch[ch[root][]][]] ^= ;
f2 = find(t+);
splay(f2, f1);
delta[ch[ch[root][]][]] ^= ;
f1 = find(t+);
f2 = find(s+t+);
splay(f1, );
splay(f2, f1);
delta[ch[ch[root][]][]]^=;
}
print(root);
for(int i = ; i < n; i++) printf("%d ", ans[i]);
printf("%d\n", ans[n]);
}
2018牛客多校第三场 C.Shuffle Cards的更多相关文章
- 牛客多校第三场 F Planting Trees
牛客多校第三场 F Planting Trees 题意: 求矩阵内最大值减最小值大于k的最大子矩阵的面积 题解: 矩阵压缩的技巧 因为对于我们有用的信息只有这个矩阵内的最大值和最小值 所以我们可以将一 ...
- 牛客多校第三场 G Removing Stones(分治+线段树)
牛客多校第三场 G Removing Stones(分治+线段树) 题意: 给你n个数,问你有多少个长度不小于2的连续子序列,使得其中最大元素不大于所有元素和的一半 题解: 分治+线段树 线段树维护最 ...
- 牛客多校第三场 A—pacm team (4维背包加路径压缩)
链接:https://www.nowcoder.com/acm/contest/141/A 来源:牛客网 Eddy was a contestant participating , Eddy fail ...
- 牛客多校第三场-A-PACM Team-多维背包的01变种
题目我就不贴了...说不定被查到要GG... 题意就是我们需要在P,A,C,M四个属性的限制下,找到符合条件的最优解... 这样我们就需要按照0/1背包的思路,建立一个五维度数组dp[i][j][k] ...
- 牛客多校第三场 A- PACM Team 背包/记忆路径
https://www.nowcoder.com/acm/contest/141#question 一眼背包,用四维dp记录在A,B,C,D条件限制下可以获得的最大知识点,但是题目要求输出路径,在输入 ...
- 2018牛客多校第六场 G.Pikachu
题意: 给出一棵n个点的树,每条边有边权.对这个树加边变成一个完全图.新加的边的权值为边上两点在树上的距离.求完全图上任意两点的最大流之和. 题解: 一共有C(n,2)个点对.假设当前求s到t之间的最 ...
- 2018牛客多校第六场 I.Team Rocket
题意: 给出n个区间和m个点(点按顺序给出且强制在线).每个区间只会被第一个他包含的点摧毁.问每个点能摧毁多少个区间以及每个区间是被哪个点摧毁的. 题解: 将n个区间按照左端点排序,然后用vector ...
- 2018牛客多校第五场 H.subseq
题意: 给出a数组的排列.求出字典序第k小的b数组的排列,满足1<=bi<=n,bi<bi+1,a[b[i]]<a[b[i+1]],m>0. 题解: 用树状数组倒着求出以 ...
- 2018牛客多校第五场 E.room
题意: 一共有n个宿舍,每个宿舍有4个人.给出第一年的人员分布和第二年的人员分布,问至少有多少人需要移动. 题解: 对于第一年的每个宿舍,向今年的每种组合连边.流量为1,费用为(4 - 组合中已在该宿 ...
随机推荐
- http状态码(status_codes)
首先:1XX 接受的请求正在处理,2XX请求正常处理完毕,3XX需要进行附加操作以完成请求(重定向?),4XX服务器无法处理请求(也就是客户端请求错误),5XX服务器处理请求出错. 当然不仅仅是一张图 ...
- python中字典的遍历
用ipython运行情况如下: #新建字典 In [1]: name_cards = {'name':'sunwukong','QQ':'123124','addr':'秦皇岛'} #生成key对象 ...
- go web cookie和session
cookie是存储在浏览器端,session是服务器端 cookie是有时间限制的,分会话cookie和持久cookie,如果不设置时间,那周期就是创建到浏览器关闭为止.这种是会话cookie,一般保 ...
- springboot2.x+maven+proguard代码混淆
由于需要将源码打包做代码混淆,选择proguard,开始使用各种问题,各种jar包版本问题,但最终成功了,记录一下,也希望能够帮助大家 在pom中添加代码: <build> <fin ...
- 关于 spring-aop理解
对于Aop 一直理解很是不到位 谈谈自己理解! Aop : Aspect: 切面 joinpoint 连接点 pointCut 切点 Advice 增强 targert 目标对象 w ...
- Django笔记 —— Admin(Django站点管理界面)
最近在学习Django,打算玩玩网页后台方面的东西,因为一直很好奇但却没怎么接触过.Django对我来说是一个全新的内容,思路想来也是全新的,或许并不能写得很明白,所以大家就凑合着看吧- 本篇笔记(其 ...
- ES5新增数组方法(3):some
检查数组元素中是否有元素符合指定. // 数组中的元素部分满足指定条件返回true let arr = [1, 3, 5, 7, 9]; console.log(arr.some((value, in ...
- Python第三方库之openpyxl(3)
Python第三方库之openpyxl(3) 区域图 区域图类似于折线图,绘图线下面的区域会被填充,通过将分组设置为“standard”.“stacked”或“percentStacked”,可以获得 ...
- Visual Studio 2013安装包
点击下载
- ubuntu安装显卡驱动和cuda
NVIDIA-linux.run安装后,会出现登录页面循环,解决办法是在运行命令后加入-no-opengl-files 打开nvidia x server Settings软件,显示:You do n ...