構造數組

題目鏈接:構造數組


我們從後往前考慮,如果當前加入的數字的下標爲pos,那麼我們就是相當於在當前操作和之前操作插入的數字的第pos個位置。

所以我們其實就是動態第k大的位置。


AC代碼:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=5e5+10;
int n,id[N],a[N],sum[N<<2],res[N];
#define mid (l+r>>1)
void build(int p,int l,int r){
	if(l==r){sum[p]=1; return ;}
	build(p<<1,l,mid),build(p<<1|1,mid+1,r);
	sum[p]=sum[p<<1]+sum[p<<1|1];
}
void change(int p,int l,int r,int x){
	if(l==r){sum[p]=0; return ;}
	if(x<=mid)	change(p<<1,l,mid,x);
	else	change(p<<1|1,mid+1,r,x);
	sum[p]=sum[p<<1]+sum[p<<1|1];
}
int ask(int p,int l,int r,int k){
	if(l==r)	return l;
	if(sum[p<<1]>=k)	return ask(p<<1,l,mid,k);
	else	return ask(p<<1|1,mid+1,r,k-sum[p<<1]);
}
signed main(){
	cin>>n;	build(1,1,n);
	for(int i=1;i<=n;i++)	scanf("%d %d",&id[i],&a[i]);
	for(int i=n;i>=1;i--){
		int pos=ask(1,1,n,id[i]);
		res[pos]=a[i]; change(1,1,n,pos);
	}
	for(int i=1;i<=n;i++)	printf("%d ",res[i]);
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章