stl中一些函数的用法
- prev的用法
- lower_bound() 函数用于在指定区域内查找不小于目标值的第一个元素;upper_bound() 函数定义在头文件中,用于在指定范围内查找大于目标值的第一个元素。
思路很简单,实现的时候本来想用优先队列实现,但优先队列只能解决字典序最小的。用set可以方便地去除确定位置上的数字(同时作为有序容器,set可以使用lower_bound和upper_bound函数),而别的数据结构没有这样的优势。
#include <iostream>
#include <set>
using namespace std;
int data[200005];
int n;
void solve(){
set<int> s;
for(int i=1;i<=n;i++)
s.insert(i);
for(int i=1;i<=n;i++)
if(data[i]!=data[i-1]){
cout<<data[i]<<' ';
s.erase(data[i]);
}else{
cout<<*s.begin()<<' ';//从小到大输出
s.erase(*s.begin());
}
cout<<endl;
for(int i=1;i<=n;i++)
s.insert(i);
for(int i=1;i<=n;i++)
if(data[i]!=data[i-1]){
cout<<data[i]<<' ';
s.erase(data[i]);
}else{
cout<<*prev(s.lower_bound(data[i]))<<' ';//大于等于data[i]的前一个
s.erase(*prev(s.lower_bound(data[i])));
}
cout<<endl;
}
int main()
{
int t;
cin>>t;
while(t--){
cin>>n;
for(int i=1;i<=n;i++)
cin>>data[i];
solve();
}
return 0;
}