过不了样例求调
查看原帖
过不了样例求调
252549
Iwara楼主2024/9/26 20:01

RT

我根本不会二分。

#include<bits/stdc++.h>
#include<random>
using namespace std;
typedef long long ll;
mt19937 rd(time(0));
const ll MAXN=5e5+5;
ll n,m,op,x,y,z;
ll a[MAXN];
struct node{
	ll lson,rson;
	ll val,pri,sz;
};
node treap[MAXN*20];
ll tot,rt[MAXN];
void new_node(ll num){
	tot++;
	treap[tot].val=num;
	treap[tot].pri=rd();
	treap[tot].lson=treap[tot].rson=0;
	treap[tot].sz=1;
	return;
}
void update(ll now){
	treap[now].sz=treap[treap[now].lson].sz+treap[treap[now].rson].sz+1;
	return;
}
void split(ll now,ll num,ll &L,ll &R){
	if(now==0){
		L=R=0;
		return;
	}
	if(treap[now].val<=num){
		L=now;
		split(treap[now].rson,num,treap[now].rson,R);
	}
	else{
		R=now;
		split(treap[now].lson,num,L,treap[now].lson); 
	}
	update(now);
	return;
}
ll merge(ll L,ll R){
	if(L==0||R==0)return L+R;
	if(treap[L].pri>treap[R].pri){
		treap[L].rson=merge(treap[L].rson,R);
		update(L);
		return L;
	}
	else{
		treap[R].lson=merge(L,treap[R].lson);
		update(R);
		return R;
	}
}
ll insert(ll id,ll num){
	ll L=0,R=0;
	split(rt[id],num,L,R);
	new_node(num);
	rt[id]=merge(merge(L,tot),R);
	return tot;
}
void build(ll id,ll L,ll R){
	for(int i=L;i<=R;i++)insert(id,a[i]);
//	cout<<rt[id]<<"<<\n";
	if(L!=R){
		ll mid=(L+R)>>1;
		build(id<<1,L,mid);
		build(id<<1|1,mid+1,R);
	}
	return;
}
ll rk(ll id,ll num){
	ll L=0,R=0,res=1;
	split(rt[id],num-1,L,R);
	if(L)res=treap[L].sz+1;
	rt[id]=merge(L,R);
	return res;
}
ll query_rk(ll id,ll L,ll R,ll QL,ll QR,ll num){
	if(R<QL||L>QR)return 0;
	if(QL<=L&&R<=QR)return rk(id,num);
	ll mid=(L+R)>>1;
	return query_rk(id<<1,L,mid,QL,QR,num)+query_rk(id<<1|1,mid+1,R,QL,QR,num);
}
ll kth(ll now,ll num){
//	cout<<num<<" ?!\n";
	if(treap[treap[now].lson].sz+1==num)return now;
	if(treap[treap[now].lson].sz>=num){
//		cout<<"LLL\n";
		return kth(treap[now].lson,num);
	}
	return kth(treap[now].rson,num-(treap[treap[now].lson].sz+1));
}
ll query_kth(ll L,ll R,ll num){
	ll _L=0,_R=1e8;
	while(_L<=_R){
		ll mid=(_L+_R)>>1,res=query_rk(1,1,n,L,R,mid);
		if(res<=num)_L=mid+1;
		else _R=mid-1;
	}
	return _R;
}
ll del(ll id,ll num){
	ll L,R,M;
	split(rt[id],num,L,R);
	split(L,num-1,L,M);
	M=merge(treap[M].lson,treap[M].rson);
	rt[id]=merge(merge(L,M),R);
	return rt[id];
}
void update_del(ll id,ll L,ll R,ll k,ll num){
	del(id,a[k]);
	insert(id,num);
	if(L==R)return;
	ll mid=(L+R)>>1;
	if(k<=mid)update_del(id<<1,L,mid,k,num);
	else update_del(id<<1|1,mid+1,R,k,num);
	return;
}
ll pre(ll id,ll num){
	ll L=0,R=0,res=-2147483647;
	split(rt[id],num-1,L,R);
	if(L)res=treap[kth(L,treap[L].sz)].val;
	rt[id]=merge(L,R);
	return res;
}
ll query_pre(ll id,ll L,ll R,ll QL,ll QR,ll num){
	if(R<QL||L>QR)return -2147483647;
	if(QL<=L&&R<=QR)return pre(id,num);
	ll mid=(L+R)>>1;
	return max(query_pre(id<<1,L,mid,QL,QR,num),query_pre(id<<1|1,mid+1,R,QL,QR,num));
}
ll nxt(ll id,ll num){
	ll L=0,R=0,res=2147483647;
	split(rt[id],num,L,R);
	if(R)res=treap[kth(R,1)].val;
	rt[id]=merge(L,R);
	return res;
}
ll query_nxt(ll id,ll L,ll R,ll QL,ll QR,ll num){
	if(R<QL||L>QR)return 2147483647;
	if(QL<=L&&R<=QR)return nxt(id,num);
	ll mid=(L+R)>>1;
	return min(query_nxt(id<<1,L,mid,QL,QR,num),query_nxt(id<<1|1,mid+1,R,QL,QR,num));
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,1,n);
	for(int i=1;i<=m;i++){
		cin>>op;
		if(op==1){
			cin>>x>>y>>z;
			cout<<query_rk(1,1,n,x,y,z)<<'\n';
		} 
		else if(op==2){
			cin>>x>>y>>z;
			cout<<query_kth(x,y,z)<<'\n';
		}
		else if(op==3){
			cin>>x>>y;
			update_del(1,1,n,x,y);
			a[x]=y;
		}
		else if(op==4){
			cin>>x>>y>>z;
			cout<<query_pre(1,1,n,x,y,z)<<'\n';
		}
		else{
			cin>>x>>y>>z;
			cout<<query_nxt(1,1,n,x,y,z)<<'\n';
		}
	}
	return 0;
} 
2024/9/26 20:01
加载中...