How C easy?
  • 板块学术版
  • 楼主wanjiabao
  • 当前回复6
  • 已保存回复6
  • 发布时间2025/6/21 21:56
  • 上次更新2025/6/22 17:13:53
查看原帖
How C easy?
939957
wanjiabao楼主2025/6/21 21:56

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;
	}
}
2025/6/21 21:56
加载中...