牛客网多校第3场 C-shuffle card 【splay伸展树】
题目链接:戳这里
转自:戳这里
关于splay入门:戳这里
题意:给n个数,进行m次操作,每次都从n个数中取出连续的数放在最前面。
解题思路:splay的区间操作。
附代码:
1 #include<iostream>
2 #include<stdio.h>
3 using namespace std;
4 int n,m,sz,rt;
5 int fa[100005],c[100005][2],id[100005];
6 int size[100005];
7 bool rev[100005];
8 void pushup(int k)
9 {
10 int l=c[k][0],r=c[k][1];
11 size[k]=size[l]+size[r]+1;
12 }
13 void pushdown(int k)
14 {
15 int l=c[k][0],r=c[k][1];
16 if(rev[k])
17 {
18 swap(c[k][0],c[k][1]);
19 rev[l]^=1;rev[r]^=1;
20 rev[k]=0;
21 }
22 }
23 void rotate(int x,int &k)
24 {
25 int y=fa[x],z=fa[y],l,r;
26 if(c[y][0]==x)l=0;else l=1;r=l^1;
27 if(y==k)k=x;
28 else {if(c[z][0]==y)c[z][0]=x;else c[z][1]=x;}
29 fa[x]=z;fa[y]=x;fa[c[x][r]]=y;
30 c[y][l]=c[x][r];c[x][r]=y;
31 pushup(y);pushup(x);
32 }
33 void splay(int x,int &k)
34 {
35 while(x!=k)
36 {
37 int y=fa[x],z=fa[y];
38 if(y!=k)
39 {
40 if(c[y][0]==x^c[z][0]==y)rotate(x,k);
41 else rotate(y,k);
42 }
43 rotate(x,k);
44 }
45 }
46 int find(int k,int rank)
47 {
48 pushdown(k);
49 int l=c[k][0],r=c[k][1];
50 if(size[l]+1==rank)return k;
51 else if(size[l]>=rank)return find(l,rank);
52 else return find(r,rank-size[l]-1);
53 }
54 void rever(int l,int r)
55 {
56 int x=find(rt,l),y=find(rt,r+2);
57 splay(x,rt);splay(y,c[x][1]);
58 int z=c[y][0];
59 rev[z]^=1;
60 }
61 void build(int l,int r,int f)
62 {
63 if(l>r)return;
64 int now=id[l],last=id[f];
65 if(l==r)
66 {
67 fa[now]=last;size[now]=1;
68 if(l<f)c[last][0]=now;
69 else c[last][1]=now;
70 return;
71 }
72 int mid=(l+r)>>1;now=id[mid];
73 build(l,mid-1,mid);build(mid+1,r,mid);
74 fa[now]=last;pushup(mid);
75 if(mid<f)c[last][0]=now;
76 else c[last][1]=now;
77 }
78 int main()
79 {
80 scanf("%d%d",&n,&m);
81 for(int i=1;i<=n+2;i++)
82 id[i]=++sz;
83 build(1,n+2,0);rt=(n+3)>>1;
84 for(int i=1;i<=m;i++)
85 {
86 int l,r;
87 scanf("%d%d",&l,&r);
88 rever(1,l+r-1); //区间通过3次翻转,达到洗牌效果
89 rever(1,r);
90 rever(r+1,l+r-1);
91 }
92 for(int i=2;i<=n+1;i++)
93 printf("%d ",find(rt,i)-1);
94 return 0;
95 }
牛客网多校第3场 C-shuffle card 【splay伸展树】的更多相关文章
- 牛客网多校第3场C-shuffle card 平衡树或stl(rope)
链接:https://www.nowcoder.com/acm/contest/141/C 来源:牛客网 题目描述 Eddy likes to play cards game since there ...
- 牛客网多校第3场Esort string (kmp)
链接:https://www.nowcoder.com/acm/contest/141/E 来源:牛客网 题目描述 Eddy likes to play with string which is a ...
- 牛客网多校赛第九场A-circulant matrix【数论】
链接:https://www.nowcoder.com/acm/contest/147/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...
- 牛客网多校训练第二场D Kth Minimum Clique
链接:https://ac.nowcoder.com/acm/contest/882/D来源:牛客网 Given a vertex-weighted graph with N vertices, fi ...
- 牛客网多校第5场 H subseq 【树状数组+离散化】
题目:戳这里 学习博客:戳这里 题意:给n个数为a1~an,找到字典序第k小的序列,输出该序列所有数所在位置. 解题思路:先把所有序列预处理出来,方法是设一个数组为dp,dp[i]表示以i为开头的序列 ...
- 牛客网多校第5场 I vcd 【树状数组+离散化处理】【非原创】
题目:戳这里 学习博客:戳这里 作者:阿狸是狐狸啦 n个点,一个点集S是好的,当且仅当对于他的每个子集T,存在一个右边无限延长的矩形,使的这个矩形包含了T,但是和S-T没有交集. 求有多少个这种集合. ...
- 牛客网多校第4场 J Hash Function 【思维+并查集建边】
题目链接:戳这里 学习博客:戳这里 题意: 有n个空位,给一个数x,如果x%n位数空的,就把x放上去,如果不是空的,就看(x+1)%n是不是空的. 现在给一个已经放过数的状态,求放数字的顺序.(要求字 ...
- 牛客网多校第4场 A.Ternary String 【欧拉降幂】
题目:戳这里 学习博客:戳这里 欧拉函数的性质: ① N是不为0的整数.φ(1)=1(唯一和1互质的数就是1本身) ② 除了N=2,φ(N)都是偶数. ③ 小于N且与N互质的所有数的和是φ(n)*n/ ...
- 牛客网多校训练第一场 J - Different Integers(树状数组 + 问题转换)
链接: https://www.nowcoder.com/acm/contest/139/J 题意: 给出n个整数的序列a(1≤ai≤n)和q个询问(1≤n,q≤1e5),每个询问包含两个整数L和R( ...
- 牛客网多校训练第一场 I - Substring(后缀数组 + 重复处理)
链接: https://www.nowcoder.com/acm/contest/139/I 题意: 给出一个n(1≤n≤5e4)个字符的字符串s(si ∈ {a,b,c}),求最多可以从n*(n+1 ...
随机推荐
- SDNU_ACM_ICPC_2021_Winter_Practice_1st [个人赛] 2021.1.19 星期二
SDNU_ACM_ICPC_2021_Winter_Practice_1st [个人赛] K - Color the ball 题意: 有n个气球,每次都给定两个整数a,b,给a到b内所有的气球涂一个 ...
- LTH7锂电池充放电IC完整方案
内容目录: A,LTH7贴片5脚充电芯片 PW4054 1, 单节的锂电池保护电路 单节为3.7V锂电池(也叫4.2V)和3.8V锂电池(也叫4.35V) 2, 单节的锂电池充电电路 ...
- functools.singledispatchmethod(Python 3.8) | 码农网 https://www.codercto.com/a/83245.html
functools.singledispatchmethod(Python 3.8) | 码农网 https://www.codercto.com/a/83245.html
- 监听套接字描述字 已连接套接字描述字 和打电话的情形非常不一样的地方 完成了 TCP 三次握手,操作系统内核就为这个客户生成一个已连接套接字
1. accept: 电话铃响起了-- 当客户端的连接请求到达时,服务器端应答成功,连接建立,这个时候操作系统内核需要把这个事件通知到应用程序,并让应用程序感知到这个连接.这个过程,就好比电信运营商完 ...
- wireshark使用手册
Wireshark的过滤器 使用Wireshark时最常见的问题,是当您使用默认设置时,会得到大量冗余信息,以至于很难找到自己需要的部分. 过犹不及. 这就是为什么过滤器会如此重要.它们可以帮助我们在 ...
- python基础(int,str,bool,list)
1数字int. 数字主要是用于计算用的,使用方法并不是很多,就记住一种就可以: bit_length() #bit_length() 当十进制用二进制表示时,最少使用的位数 v = 11 1 ...
- 算法总结篇---KMP算法
目录 写在前面 例题 剪花布条 Radio Transmission OKR-Periods of Words 似乎在梦中见过的样子 Censoring 写在前面 仅为自用,不做推广 一起来看猫片吧! ...
- C#Process调用外部程序
前言 使用C#调用外部程序,一种是通过Process类,一种是通过命令行,本文主要说一下使用C#中的Process类调用外部程序的方式. 过程: 1. 创建Process对象 2. 配置启动选项(输入 ...
- XCTF-黑客精神
杂言 前段时间键盘坏了,电脑硬盘也坏了,买东西装系统再偷个懒放了一周左右假.期间学习巩固了一下安卓开发的知识.用了固态才知道什么叫纵享丝滑,当初就不该省这个钱. 前期工作 查壳,无.运行,点击按钮就跳 ...
- 如何在windows下切换node版本
安装nvm 最近的项目中,一个是用vue项目开发,一个是使用react开发,但是ant design pro使用了umi框架,所需要的node版本>10.0.0,vue那个项目中又不兼容node ...