牛客网多校第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 ...
随机推荐
- Inlook - 你的私人工作助理 V1.0.0.2
Inlook - Your personal assistant 中文版|English version Introduction Inlook是为在桌面上直观地提醒用户收到未读邮件和日程安排而开发的 ...
- 消息队列之kafka
消息队列之activeMQ 消息队列之RabbitMQ 1.kafka介绍 kafka是由scala语言开发的一个多分区,多副本的并且居于zookeeper协调的分布式的发布-订阅消息系统.具有高吞吐 ...
- 三十三:WEB漏洞-逻辑越权之水平垂直越权
水平和垂直越权 水平越权:可以获得同级别用户权限 垂直权限:享受高几个层次的用户权限 解释,原理,检测,利用,防御 通过更换的某个ID之类的身份标识,从而使得A账号获取(修改,删除)B账号的数据,通过 ...
- Nginx架构赏析
淘宝的某位大佬曾经做过测试,在一台24G内存的机器上,Nginx的最大并发连接数达到了200万.同学们听到这个结论后,是不是被Nginx的超高性能深深折服了,它内部的架构设计究竟是怎么样的呢?这篇文章 ...
- JavaScript中eval的替代方法
引自:https://www.cnblogs.com/lxg0/p/7805266.html 通常我们在使用ajax获取到后台返回的json数据时,需要使用 eval 这个方法将json字符串转换成对 ...
- QUIC协议分析-基于quic-go
quic协议分析 QUIC是由谷歌设计的一种基于UDP的传输层网络协议,并且已经成为IETF草案.HTTP/3就是基于QUIC协议的.QUIC只是一个协议,可以通过多种方法来实现,目前常见的实现有Go ...
- 当Vue可视化工具创建不了项目时的解决办法!
当Vue可视化工具创建不了项目时的解决办法! 当你尝试用可视化工具创建一个Vue的项目的时候,报错, 出现什么indexOf什么什么的错误! 我的解决办法是把可视化工具删除掉,重新下载! 如果你是 n ...
- ES 2021 来了,详细解读5个新特性,附案例
ES 2021是世界上最受欢迎的编程语言的最新版本〜 本次迭代中包含了五个新特性,让我们来一睹为快. 1.全部替换replaceAll: js默认的replace 方法仅替换字符串中一个模式的第一个实 ...
- centos7+python3+selenium+chrome
一.安装GUI图形化界面 (1)安装GUI图形化界面 yum groupinstall "GNOME Desktop" "Graphical Administration ...
- Jmeter(三十七) - 从入门到精通进阶篇 - 输出HTML格式的性能测试报告(详解教程)
1.简介 相对于Loadrunner,Jmeter其实也是可以有测试报告产出的,虽然一般都不用(没有Loadrunner的报告那么强大是一方面),但是有小伙伴们私下问,那宏哥还是顺手写一下吧,今天我们 ...