珂朵莉树+计数排序(求助证明时间复杂度)
查看原帖
珂朵莉树+计数排序(求助证明时间复杂度)
285617
黑影洞人楼主2022/7/10 12:27
#include<cstdio>
#include<algorithm>
#include<set>
#include<iostream>
#define Chtholly_tree ct
#define Chtholly set<Chtholly_tree>::iterator
using namespace std;
struct Chtholly_tree{
	int l,r;
	mutable int val;
	ct(int a=-1,int b=-1,int c=0){l=a,r=b,val=c;}
	bool operator <(const Chtholly_tree &c)const{return l<c.l;}
};
int n,m;
set<Chtholly_tree>st;
Chtholly split(int p){
	Chtholly it=st.lower_bound(ct(p,0,0));
	if(it!=st.end()&&it->l==p)return it;
	it--;ct tmp=*it;st.erase(it);
	st.insert(ct(tmp.l,p-1,tmp.val));
	return st.insert(ct(p,tmp.r,tmp.val)).first;
}
void cntsort(int L,int R,bool b){
	Chtholly r=split(R+1),l=split(L);
	int c[114514]={0};int pos=L;int mxp=0,mnp=1919810;
	for(Chtholly ll=l;ll!=r;ll++)mnp=min(mnp,ll->val),mxp=max(mxp,ll->val),c[ll->val]+=(ll->r)-(ll->l)+1;
	st.erase(l,r);
	//printf("%d %d\n",mnp,mxp);
	if(b)for(int i=mnp;i<=mxp;i++){
		if(c[i]==0)continue;
		st.insert(ct(pos,pos+c[i]-1,i)),pos+=c[i];
	}
	else for(int i=mxp;i>=mnp;i--){
		if(c[i]==0)continue;
		st.insert(ct(pos,pos+c[i]-1,i)),pos+=c[i];
	}
}
signed main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		int xx;
		scanf("%d",&xx);
		st.insert(ct(i,i,xx));	
	}	
	st.insert(ct(n+1,n+1,0));
	while(m--){
		int l,r,op;
		scanf("%d%d%d",&op,&l,&r);
		cntsort(l,r,!op);
	}
	int cnt=0,q=0;
	scanf("%d",&q);
	for(Chtholly it=st.begin();it!=st.end()&&it->r<=n;it++){
		for(int i=it->l;i<=it->r;i++)if(++cnt==q)return printf("%d",it->val),0;	
	}
	return 0;
}

2022/7/10 12:27
加载中...