题目

Description
给出 n 条平行的纵向轨道 ,有 m 根横向的短棒支在一些相邻轨道上。如果在某个轨道顶端释放一个小球,它会沿着这个轨道一直下落,一旦碰到短棒就会沿着短棒滚到相邻轨道并继续下落。

为了增加难度,每次可能会拿走某些短棒,或者询问一个从 x 号轨道下落的小球最终落到哪个轨道。

Input
第一行读入两个整数 n,m (2≤n≤5×105,0≤m≤5×105),分别表示轨道的数量和短棒的数量。 第二行读入 m 个整数,第 i 个整数记为 idi (1≤idi<n) ,表示从上到下第 i 根短棒位于编号为 idi 和 idi+1 的轨道之间。 第三行读入一个整数 Q (1≤Q≤5×105),表示操作总数。 接下来读入 Q 行,每行读入两个整数 opt,x。如果 opt=1,表示拿走从上到下的第 x (1≤x≤m) 根短棒。保证不会拿走重复的木棒。如果 opt=2,询问一个初始从轨道 x (1≤x≤n) 下落的小球最终落到了哪个轨道。

Output
对于每一个 opt=2 的操作,输出最终到达的轨道编号。

Sample Input
6 5
2 1 5 3 2
10
2 1
2 2
2 6
1 3
2 6
2 3
1 1
2 2
2 3
2 4
Sample Output
3
4
5
6
1
1
4
2
Hint
一共有 10 组测试数据,数据有梯度。

测试点编号 特殊性质
1,2,3 m,Q≤1000
4,5 没有拿走短棒的操作
6,7 n,m,Q≤50000
8 n=m=Q=100000,初始短棒位置、拿走的短棒、询问的轨道都在其可行范围内均匀随机
9,10 无特殊约定

思路

先考虑无修改

因为没有修改,可以考虑提前算出所有的答案。
一开始设ansi=i ,从低到高观察每一根木棒:如果它位于 (i,i+1)之间,相当于交换(ansi,ansi+1)的值。预处理完后就可以直接输出答案了。

考虑原题

我们把木棒的两个端点和轨道的起点终点全都提出来当做关键点。针对一开始的木棒摆放,我们在关键点之间连边。

显然此时如果询问一个 ,我们就沿着 这条链一直走下去,终点就是答案。
如果遇到删除一根木棒呢?我们会发现这等价于:把x所在的链的尾部和x+1所在链的尾部交换,同时删除x和x+1这两个点(其实不删除也不影响答案)。
我们可以直接用平衡树维护这个操作。拿 Splay 举例,每次将 和 旋转至根,交换它们的右子树。

代码

#include<bits/stdc++.h>
using namespace std;
const int N=4e6+77;
int s[N][2],f[N],a[N],yjy[N],n,m,cnt;
void rotate(int x){int y=f[x],z=f[y],w=s[y][0]==x;if (s[y][w^1]=s[x][w]) f[s[x][w]]=y;if (z) s[z][s[z][1]==y]=x;s[x][w]=y;f[y]=x;f[x]=z;
}
void splay(int x){while (f[x]){int y=f[x],z=f[y];if (z)rotate(((s[z][1]==y)^(s[y][1]==x))?x:y);rotate(x);}
}
int main(){scanf("%d%d",&n,&m);for (int i=1;i<=m;i++)scanf("%d",&a[i]);cnt=1;for (int i=m;i;i--){++cnt;if (f[cnt]=yjy[a[i]])s[yjy[a[i]]][1]=cnt;yjy[a[i]]=cnt^1;++cnt;if (f[cnt]=yjy[a[i]+1])s[yjy[a[i]+1]][1]=cnt;yjy[a[i]+1]=cnt^1;}for (int i=1;i<=n;i++){++cnt;if (f[cnt]=yjy[i])s[yjy[i]][1]=cnt;}int Q;scanf("%d",&Q);while (Q--){int T,x;scanf("%d%d",&T,&x);if (T==1){int p=(m-x+1)*2,q=p+1;splay(p);splay(q);if (s[p][1]) f[s[p][1]]=q;if (s[q][1]) f[s[q][1]]=p;swap(s[p][1],s[q][1]);}else {x+=2*m+1;splay(x);int ret=x;for (;s[ret][0];ret=s[ret][0]);printf("%d\n",ret<=2*m+1?a[m-ret/2+1]+(ret&1):x-2*m-1);}}
}

【noi.ac#1771】ball相关推荐

  1. 【noi.ac #596】road

    题目 小P和小R是一对非常好的朋友,今天他们在玩一个模拟建设类游戏. 游戏中共有nn个城市,通过mm条双向道路连接.第ii条道路连接了城市aiai和bibi. 不幸的是,在一次巨大的灾难以后,这mm条 ...

  2. 【VC/AC论文】Any-to-Many Voice Conversion withLocation-Relative Sequence-to-Sequence Modeling

    文章目录 Abstract Introduction Related Work Attention mechanisms in seq2seq model | seq2seq模型中的注意机制 A se ...

  3. 【noi.ac】163.仰望星空

    题目 [问题描述] 每天晚上,LYC都会在市少年宫的操场上仰望星空.时间久了,他便开始觉得无聊. 于是LYC选择了第一颗星星,以它为圆心画了一个半径为RR的圆并将星星分为两类,其中圆外不包括边界上的点 ...

  4. 【noi 2.5_7834】分成互质组(dfs)

    有2种dfs的方法: 1.存下每个组的各个数和其质因数,每次对于新的一个数,与各组比对是否互质,再添加或不添加入该组. 2.不存质因数了,直接用gcd,更加快.P.S.然而我不知道为什么RE,若有好心 ...

  5. 【NOI题库】【NOIP2016PJ猜题】雇佣兵

    雇佣兵 [问题描述] 雇佣兵的体力最大值为M,初始体力值为0,战斗力为N,拥有X个能量元素.(0 < M, N, X ≤ 10,000) 当雇佣兵的体力值恰好为M时,才可以参加一个为期M天的战斗 ...

  6. 【noi 2.5_8465】马走日(dfs)

    最基本的dfs.这代码理应超时的,我也不知为何AC了......打表我都放弃了,因为最大的数据真的要跑很久...... 1 #include<cstdio> 2 #include<c ...

  7. 【华为 AC+AP】

    华为AC+AP项目配置 让每个 AP 拥有IP地址,但是AP的数量非常多,并且分布广泛,又不能挨个挨个去配置,所以,我们可以通过 DHCP 的方式,让每个 AP 自动获取IP地址. 一.配置DHCP服 ...

  8. 【noi 2.6_9284】盒子与小球之二(DP)

    题意:有N个有差别的盒子和分别为A个和B个的红球和蓝球,盒子内可空,问方案数. 解法:我自己打的直接用了求组合C的公式,把红球和蓝球分开看.对于红球,在N个盒子可放任意个数,便相当于除了A个红球还有N ...

  9. 【NOI online 2】游戏【二项式反演】【树上背包】

    题意:一棵n=2mn=2mn=2m个点的树,mmm个白点和mmm个黑点.对于k∈[0,n]k\in [0,n]k∈[0,n],求出 把点黑白两两配对使得恰好有kkk对点有祖孙关系 的方案数 模9982 ...

最新文章

  1. Mcad学习笔记之序列化(2进制和Soap序列化)
  2. 文件上传功能-本地存储、阿里OSS、七牛云
  3. 【DP】【递归】分离与合体
  4. Django实战1-权限管理功能实现-01:搭建开发环境
  5. 用C#开发Windows应用程序
  6. Linux 等待进程结束 wait() 和 waitpid()
  7. 小程序循环里做字符串拼接_昨天还在for循环里写加号拼接字符串的那个同事,今天已经不在了...
  8. win7计算机用户文件,win7系统用户文件夹改名的图文教程
  9. excel插入一列日期 pandas_在Excel目标列插入日期控件的方法
  10. UE4之FString转换
  11. 基于SSM的电影购票系统
  12. 现代文文言文转化器_初中语文丨7个文言文背诵技巧,不再为背书发愁,实用收藏...
  13. 研究了那么多内容后,我们打算推荐这些公众号给你
  14. c语言三位数中有多少素数,输出所以三位数的素数,并求素数的个数,每行输出10个数...
  15. 20210505 秀米导入已发布微信推送的所有内容
  16. 揭秘 手机群控 带来的利益
  17. 一个登录的自动化测试用例(新手)
  18. 简单实现Vite的HRM热更新 ———《第二篇热更新上》
  19. 德国知名厨具菲仕乐高速快锅,美味和效能我全都要!
  20. 腾讯2020iOS面试题

热门文章

  1. 小乌龟(TortoiseGit)配置git的ssh连接到gitlab
  2. mysql数据库密码的修改
  3. 精通lambda表达式:Java多核编程pdf
  4. DBMS/Database:数据库管理的简介、安装(注意事项等)、学习路线(基于SQLSever深入理解SQL命令语句综合篇《初级→中级→高级》/几十项代码案例集合)之详细攻略
  5. Flutter 相关知识点
  6. 核音智言 | 数字孪生IOC,助力城市治理智能高效!
  7. Docker容器处于Removal in process 无法删除解决方案
  8. [SSH服务]——一些安全性配置和补充实验
  9. 云服务部署项目(一)——初入新世界大门
  10. pl/sql---存储过程