题目链接:戳这里

转自:戳这里

关于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伸展树】的更多相关文章

  1. 牛客网多校第3场C-shuffle card 平衡树或stl(rope)

    链接:https://www.nowcoder.com/acm/contest/141/C 来源:牛客网 题目描述 Eddy likes to play cards game since there ...

  2. 牛客网多校第3场Esort string (kmp)

    链接:https://www.nowcoder.com/acm/contest/141/E 来源:牛客网 题目描述 Eddy likes to play with string which is a ...

  3. 牛客网多校赛第九场A-circulant matrix【数论】

    链接:https://www.nowcoder.com/acm/contest/147/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...

  4. 牛客网多校训练第二场D Kth Minimum Clique

    链接:https://ac.nowcoder.com/acm/contest/882/D来源:牛客网 Given a vertex-weighted graph with N vertices, fi ...

  5. 牛客网多校第5场 H subseq 【树状数组+离散化】

    题目:戳这里 学习博客:戳这里 题意:给n个数为a1~an,找到字典序第k小的序列,输出该序列所有数所在位置. 解题思路:先把所有序列预处理出来,方法是设一个数组为dp,dp[i]表示以i为开头的序列 ...

  6. 牛客网多校第5场 I vcd 【树状数组+离散化处理】【非原创】

    题目:戳这里 学习博客:戳这里 作者:阿狸是狐狸啦 n个点,一个点集S是好的,当且仅当对于他的每个子集T,存在一个右边无限延长的矩形,使的这个矩形包含了T,但是和S-T没有交集. 求有多少个这种集合. ...

  7. 牛客网多校第4场 J Hash Function 【思维+并查集建边】

    题目链接:戳这里 学习博客:戳这里 题意: 有n个空位,给一个数x,如果x%n位数空的,就把x放上去,如果不是空的,就看(x+1)%n是不是空的. 现在给一个已经放过数的状态,求放数字的顺序.(要求字 ...

  8. 牛客网多校第4场 A.Ternary String 【欧拉降幂】

    题目:戳这里 学习博客:戳这里 欧拉函数的性质: ① N是不为0的整数.φ(1)=1(唯一和1互质的数就是1本身) ② 除了N=2,φ(N)都是偶数. ③ 小于N且与N互质的所有数的和是φ(n)*n/ ...

  9. 牛客网多校训练第一场 J - Different Integers(树状数组 + 问题转换)

    链接: https://www.nowcoder.com/acm/contest/139/J 题意: 给出n个整数的序列a(1≤ai≤n)和q个询问(1≤n,q≤1e5),每个询问包含两个整数L和R( ...

  10. 牛客网多校训练第一场 I - Substring(后缀数组 + 重复处理)

    链接: https://www.nowcoder.com/acm/contest/139/I 题意: 给出一个n(1≤n≤5e4)个字符的字符串s(si ∈ {a,b,c}),求最多可以从n*(n+1 ...

随机推荐

  1. VBScript调用winscp,实现sftp操作

    最新有一个需求,需要在ssis中调用sftp下载文件,由于服务器上只有framework2.0,并且需要用sqlserver代理调用作业,限制了很多. 首先用的是脚本任务,进程调用winscp.com ...

  2. 使用Spring的RestTemplate进行接口调用

    引自:http://www.zimug.com/ 1.常见的http服务的通信方式 经常使用的方式有HttpClient.OkHttp.RestTemplate.其中RestTemplate是一种更优 ...

  3. uni-app开发经验分享四: 实现文字复制到选择器中

    这里分享一个我经常用到的一个方法,主要是用来复制文字内容,具体代码如下: var that=this; if(!document){ uni.setClipboardData({ data:复制的值, ...

  4. jackson学习之三:常用API操作

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  5. MySQL调优之分区表

    一.分区表的应用场景 1.为什么是用分区表? 表非常大以至于无法全部都放在内存中,或者只在表的最后部分有热点数据,其他均是历史数据,分区表是指根据一定规则,将数据库中的一张表分解成多个更小的,容易管理 ...

  6. python_3 装饰器之初次见面

    装饰器 定义:本质是函数,(只不过是用来装饰其他函数而已),就是为其他函数添加附加功能 原则: 1. 不能修改被修饰函数的源代码 2.不能修改被修饰函数的调用方式 实现装饰器的知识储备 1.函数即&q ...

  7. NULL-safe equal null 索引 空字符串

    小结 1. mysql> INSERT INTO my_table (phone) VALUES (NULL); 有手机号但是不知道 mysql> INSERT INTO my_table ...

  8. 洛谷 P4999

    题目链接: P4999 烦人的数学作业 题目大意 详见题目 solution 有一个显而易见的结论 发现 \(ans_{l, r} = ans_{1. r} - ans_{1, l - 1}\) 那只 ...

  9. php中一种单引号逃逸造成的注入

    demo如下: $post = $_POST; $sql=''; $array['name'] = $post['name']; $array['age'] = 18; $array['addr'] ...

  10. 31-1.解决service iptables save出错

    CentOS 7.x开始,CentOS开始使用systemd服务来代替daemon,原来管理系统启动和管理系统服务的相关命令全部由systemctl命令来代替.service命令只保留下了极少部分使用 ...