AT1183题解

Griseo_nya

2021-03-25 18:31:02

Solution

其实这道题可以用平衡树来过,但蒟蒻不太会写平衡树,于是想到了一种可以在某种程度上替代平衡树的方法——维护一个有序的数组。 下面介绍一下用到的 STL 函数: `deque` : 同 `vector` ,可以理解为动态长度数组。下标从 $0$ 开始。 `lower_bound` : 在有序序列里找到大于等于所给项的第一个数,返回这个数的迭代器(可以理解为指针)。 `vec.erase(vec.begin()+i)` : 删除第 $i+1$ 个数。 `deque::insert()` : 在指定迭代器处添加给定的数。 然后关于代码的讲解就在代码注释里了。 还不懂可以看[这个](https://www.luogu.com.cn/blog/specialflag/solution-p3369)。 ```cpp #include<bits/stdc++.h> using namespace std; deque<int> qwq; int n; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ int op,x; scanf("%d%d",&op,&x); switch(op){ case(1): qwq.insert((lower_bound(qwq.begin(),qwq.end(),x)),x); //从 qwq 开头到结尾查询第一个大于等于 x 的数的位置,并把 x 插入到该位置(其余数后移) break; case(2): printf("%d\n",qwq[x-1]); //输出第 x 小的数 qwq.erase(qwq.begin()+x-1); //删掉第x 小的数 break; } } return 0; } ```