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 - 组合中已在该宿 ...
随机推荐
- 【mysql学习笔记整理】
/*mysql学习笔记整理*/ /*常用的数据库操作对象*/ #库的操作#创建#数据库的创建USE mysql;CREATE DATABASE db_x;#删除#删除数据库DROP DATABASE ...
- Linux 用户 和 组 快速了解
1用户 (Linux中“只有超级管理员”才有权限操作 用户 和组) 1.1添加用户 useradd 命令 例如 :useradd hly //添加了一个新账户 hly 用户添加后 会存放在一个文件中, ...
- PHP判断URL地址百度是否已经收录并主动提交MIP数据
/** * PHP检测URL地址百度是否已经收录 * @param string $url 要检测的URL地址 */ function Baidu($url) { $url = 'http://www ...
- hadoop2.7.2集群搭建
hadoop2.7.2集群搭建 1.修改hadoop中的配置文件 进入/usr/local/src/hadoop-2.7.2/etc/hadoop目录,修改hadoop-env.sh,core-sit ...
- SQL语句笔记/好记性不如烂笔头/持续更新
常用的增删改查操作,针对库,表,字段,记录分类有助于记忆,当然熟能生巧,还是需要多多实操 库操作 删除库 drop database dbx; 列出所有库 show databases; 切换库 us ...
- python集合、函数实例
集合 1.list ==>允许重复的集合,可修改 2.tuple ==>允许重复的集合,不可修改 3.dict ==> 4.set ==>不允许重复的集合,相当于不可重复的列表 ...
- 02---Nginx
Nginx .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: ...
- AES128加密-S盒和逆S盒构造推导及代码实现
文档引用了<密码编码学与网络安全--原理和实践>里边的推导过程,如有不妥,请与我联系修改. 文档<FIPS 197>高级加密标准AES,里边有个S盒构造,涉及到了数论和有限域的 ...
- REPLACE(替换字段内容)
语法: REPLACE <str1> WITH <str2> INTO <c> [LENGTH <l> ]. ABAP/4 搜索字段 <c> ...
- 在Ubuntu Server 16.04 LTS下安装VMware Tools
1.开启ubuntu server虚拟机 2.vmware workstation菜单项,选取虚拟机(M) --> 安装VMware Tools 3.mkdir /mnt/cdrom #创建一 ...