C++ 权值线段树求助
查看原帖
C++ 权值线段树求助
304524
崔化博楼主2022/3/7 21:43

40分剩下的MLE

#include <iostream>
#include <cmath>
#include <vector>
#include <string>
#include <algorithm>
#include <cstring>
using namespace std;
int n,tree[10000005],lll[10000005],rrr[10000005],rt=1,cnt=1;
#define ls(x) lll[x]
#define rs(x) rrr[x]
void push_up(int x){
	tree[x]=tree[ls(x)]+tree[rs(x)];
}
void insert(int l,int r,int &root,int k){
	if(!root)root=++cnt;
	if(l==r){
		++tree[root];
		return ;
	}
	int mid=(l+r)>>1;
	if(k<=mid)
		insert(l,mid,ls(root),k);
	else
		insert(mid+1,r,rs(root),k);
	push_up(root);
}
void remove(int l,int r,int &root,int k){
	if(!root)root=++cnt;
	if(l==r){
		--tree[root];
		return ;
	}
	int mid=(l+r)>>1;
	if(k<=mid)
		remove(l,mid,ls(root),k);
	else
		remove(mid+1,r,rs(root),k);
	push_up(root);
}
int query1(int l,int r,int root,int ll,int rr){
//	if(!root)root=++cnt;
//	cout<<l<<' '<<r<<' '<<root<<' '<<ll<<' '<<rr<<endl;
	if(l>=ll&&r<=rr){
		return tree[root];
	}
	int mid=(l+r)>>1,ans=0;
	if(ll<=mid)
		ans+=query1(l,mid,ls(root),ll,rr);
	if(rr>mid)
		ans+=query1(mid+1,r,rs(root),ll,rr);
	return ans;
}
int query2(int l,int r,int root,int k){
	if(l==r)
		return r;
	int mid=(l+r)>>1;
	if(k<=tree[ls(root)])
		return query2(l,mid,ls(root),k);
	return query2(mid+1,r,rs(root),k-tree[ls(root)]);
}
int main() {
	cin>>n;
	while(n--){
		int p,k;
		cin>>p>>k;
		switch(p){
			case 1:{
				insert(1,1e8,rt,k);
				break;
			}
			case 2:{
				remove(1,1e8,rt,k);
				break;
			}
			case 3:{
				cout<<query1(1,1e8,rt,1,k-1)+1<<endl;
				break;
			}
			case 4:{
				cout<<query2(1,1e8,rt,k)<<endl;
				break;
			}
			case 5:{
				cout<<query2(1,1e8,rt,query1(1,1e8,rt,1,k-1))<<endl;
				break;
			}
			case 6:{
				cout<<query2(1,1e8,rt,query1(1,1e8,rt,1,k)+1)<<endl;
				break;
			}
		}
	}
	return 0;
}
2022/3/7 21:43
加载中...