C题打了个set花了足足30分钟,跑得还贼慢,求问有没有什么简单的做法。
赛时代码:
#include<bits/stdc++.h>
using namespace std;
int n,q,a[500005];
set<pair<int,int>>s;
int main(){
cin>>n>>q;
for(int i=1;i<=q;i++){
cin>>a[i];
if(s.empty())s.insert({a[i],a[i]});
else if((*s.begin()).first>a[i]){
if((*s.begin()).first==a[i]+1){
int r=(*s.begin()).second;
s.erase({a[i]+1,r});
s.insert({a[i],r});
}else{
s.insert({a[i],a[i]});
}
}else if((*s.rbegin()).second<a[i]){
if((*s.rbegin()).second==a[i]-1){
int l=(*s.rbegin()).first;
s.erase({l,a[i]-1});
s.insert({l,a[i]});
}else{
s.insert({a[i],a[i]});
}
}else{
pair<int,int> x=*(--s.upper_bound({a[i],1e9})),y=*s.upper_bound({a[i],1e9});
if(x.second>=a[i]){
if(x.first==a[i]){
int r=x.second;
s.erase(x);
if(a[i]+1<=r)s.insert({a[i]+1,r});
}else if(x.second==a[i]){
int l=x.first;
s.erase(x);
if(a[i]-1>=l)s.insert({l,a[i]-1});
}else{
int l=x.first,r=x.second;
s.erase(x);
s.insert({l,a[i]-1});
s.insert({a[i]+1,r});
}
}if(x.second<a[i]-1&&y.first>a[i]+1)s.insert({a[i],a[i]});
else if(x.second==a[i]-1&&y.first==a[i]+1){
int l=x.first,r=y.second;
s.erase(x);
s.erase(y);
s.insert({l,r});
}else if(x.second==a[i]-1){
int l=x.first;
s.erase(x);
s.insert({l,a[i]});
}else if(y.first==a[i]+1){
int r=y.second;
s.erase(y);
s.insert({a[i],r});
}
}
cout<<s.size()<<endl;
}
}