牛客网多校第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 ...
随机推荐
- centos7安装vsftpd最大的坑
1.检查用户和密码没有错误2.vsftpd.conf配置没有错误3.检查/etc/vsftpd/vsftpd.conf 里面pam_service_name =vsftpd4.终极boss查看vim ...
- 自翻------Office 2013 RT 使用说明
Office Home and Student 2013 RT Preview的更新 介绍 Microsoft已发布Microsoft Office Home and Student 2013 RT ...
- Windows Server 2008 R2系统安装
把系统U盘插到服务器上,然后启动服务器进入BIOS界面选择U盘启动. 根据服务器的不同,进入BIOS界面的按钮也不一样,主流的有F10.F11.F12.F2.ESC.delete等. 在从BIOS启动 ...
- Go 语言编译过程
走进Golang之编译器原理_大愚Talk-CSDN博客 https://blog.csdn.net/hel12he/article/details/103061921 go编译器 - 知乎 http ...
- springboot项目-声明式事务失效
1.项目背景 集成了shiro配置 2. 项目分析 由于ShiroFilterFactoryBean实现了FactoryBean接口,所以它会提前被初始化.又因为SecurityManager,Sec ...
- LOJ10196越狱
题目描述 原题来自:HNOI 2008 监狱有连续编号为 1 到 n 的 n 个房间,每个房间关押一个犯人.有 m 种宗教,每个犯人可能信仰其中一种.如果相邻房间的犯人信仰的宗教相同,就可能发生越狱. ...
- SpringMVC听课笔记(三:使用@RequestMapping映射请求)
1. Spring MVC使用 @RequestMapping 注解为控制器指定可以处理哪些URL请求 2. 标注点: --类定义处:提供初步的请求映射信息.相对于WEB应用的根目录 --方法处:提供 ...
- c++复习笔记(2)
1. 类与对象 类的声明与结构,数据成员和成员函数. 成员函数可以在类外被定义.但是必须在类内声明. 封装:protect--允许类成员和派生类成员访问. 构造函数之外,还有一种初始化类成员的方法:参 ...
- Spring Boot项目application.yml文件数据库配置密码加密
在Spring boot开发中,需要在application.yml文件里配置数据库的连接信息,或者在启动时传入数据库密码,如果不加密,传明文,数据库就直接暴露了,相当于"裸奔"了 ...
- 2020牛客暑期多校训练营(第五场)B - Graph (异或 最小生成树 分治 Trie)
B - Graph 题目链接 每次操作不会改变两点之间的路径异或和 以 1 号点为起点,算出任意一点到 1 号点的异或值 dis[i](把该值当做 i 号点权值), 那么任意两点的异或值为 \(dis ...