珂朵莉树求优化
查看原帖
珂朵莉树求优化
978583
Kayisama楼主2023/9/13 21:25

哪怕让我过一个点啊!!!

看到推平就果断珂朵莉了,讨论区的对拍数据生成器最多开到50000,50005就会TLE

#include <bits/stdc++.h>
using namespace std;
//Start define.
namespace MySpace{
	#define max(a,b) (a>b?a:b)
	#define min(a,b) (a<b?a:b)
	#define lowbit(x) (x&(-x))
	template <typename T>
	inline T read(){
		register T now=0,nev=1;
		register char c=getchar();
		while(c<'0' || c>'9') {
			if(c=='-') nev=-1;
			c=getchar();
		}
		while(c>='0' && c<='9') now=(now<<1)+(now<<3)+(c&15),c=getchar();
		return now*nev;
	}
	template<typename T>
	T qpow(T a,T n,T p){
		T res=1;
		while (n){
			if (n&1) res=1ll*res*a%p;
			a=1ll*a*a%p;
			n>>=1;
		}
		return res;
	}
	template<typename T>
	T gcd(T a,T b){return (b>0?gcd(b,a%b):a);}
}
using namespace MySpace;
//const int INF=0x66CCFF66;
typedef pair<int,int> pii;
const int MAXN = 100005;
struct Node{
	int l,r;
	mutable int v;	
	Node(int L,int R,int V){
		l=L,r=R,v=V;
	}
	bool operator<(const Node tmp) const{
		return l<tmp.l;
	}
};
typedef set<Node>::iterator sit;
set<Node> tr;
inline sit split(int pos){
	sit x=tr.lower_bound(Node(pos,0,0));
	if (x!=tr.end()&&x->l==pos) return x;
	x--;
	if (x->r < pos) return tr.end();
	int l=x->l,r=x->r,v=x->v;
	tr.erase(x);
	tr.insert(Node(l,pos-1,v));
	return tr.insert(Node(pos,r,v)).first;
}
inline void assign(int l,int r,int x,int y){
	sit R=split(r+1),L=split(l);
	for (sit i=L;i!=R;i++) if (i->v==x) i->v=y;
	return;
}
inline int queryK(int l,int r,int k){
	sit R=split(r+1),L=split(l);
	vector<pii> t;
	for (sit i=L;i!=R;i++){
		t.push_back(make_pair(i->v,i->r - i->l +1));
	}
	sort(t.begin(),t.end(),[](pii a,pii b){
		return a.first<b.first;
	});
	int i,End=t.size();
	for (i=0;i<End;i++){
		if (t[i].second<k) k-=t[i].second;
		else break;
	}
	return t[i].first;
}
int n,m; 
int l,r,x,y,k,opt;
int main(){
	n=read<int>(),m=read<int>();
	for (int i=1;i<=n;i++) tr.insert(Node(i, i, read<int>()));
	while (m--){
		opt=read<int>(),l=read<int>(),r=read<int>();
		if (opt==1){
			x=read<int>(),y=read<int>();
			assign(l,r,x,y);
		}else{
			k=read<int>();
			printf("%d\n",queryK(l,r,k));
		}
	}
	return 0;
}




2023/9/13 21:25
加载中...