动态开点线段树84分求助
查看原帖
动态开点线段树84分求助
754444
tamamocross楼主2023/10/29 17:33

rt,MLE on 8 and 11

#include<iostream> 
using namespace std;
const int L=-2e9,R=2e9,Max=2e5+1,INF=0x3f3f3f3f;
int tot=1;
int a[Max],b[Max];
struct node{
	int l,r;
	int lson,rson;
	int num,val;
	node(){
		lson=0;rson=0;num=0;
	}	
}T[25*Max];
void push_up(int x){
	T[x].num=T[T[x].lson].num+T[T[x].rson].num;
}
void insert(int &x,int l,int r,int val){	
	//cout<<l<<" "<<r<<endl;
	if(x==0){
		x=++tot;
		T[x].l=l;T[x].r=r;
	}
	if(l==r){
		T[x].val=val;
		T[x].num++;
		return;
	}
	int mid;		
	if((T[x].l+T[x].r)<0){
		mid=(T[x].l+T[x].r-1)/2;
	}else{
		mid=(T[x].l+T[x].r)/2;
	}	
	if(val<=mid){
		insert(T[x].lson,l,mid,val);
	}else{
		insert(T[x].rson,mid+1,r,val);
	}
	push_up(x);	
}
int query(int p,int val){
	//cout<<T[p].l<<" "<<T[p].r<<" "<<val<<endl;
	if(T[p].l==T[p].r){
		return p;
	}
	if(T[T[p].lson].num>=val){
		return query(T[p].lson,val);
	}else{
		return query(T[p].rson,val-T[T[p].lson].num);
	}
}
int main(){
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=m;i++){
		cin>>b[i];
	}
	int xx=1;
	int p=1;
	T[1].l=L;T[1].r=R;
	for(int i=1;i<=n;i++){
		insert(xx,L,R,a[i]);
		while(b[p]==i&&p<=m){
			cout<<T[query(1,p)].val<<endl;p++;
		}		
	}
}
2023/10/29 17:33
加载中...