问题描述:
主要思路:
因为数据范围太大了,没有办法直接暴力实现。 所以采用区间覆盖的方法,将右左边界加入set中,然后依次选取即可。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<set>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pa;
set<pa> a;
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int n;
cin>>n;
a.insert({2e9,1});
for(int i=1;i<=n;i++)
{
ll x;
cin>>x;
auto k = a.lower_bound({x,0});
if(k->second<=x)
cout<<x<<" ";
else
cout<<k->second<<" ",x=k->second;
if(x<k->first) a.insert({k->first,x+1});
if(x>k->second) a.insert({x-1,k->second});
a.erase(k);
}
return 0;
}
|