这题卡整体二分了吗
查看原帖
这题卡整体二分了吗
305854
Drind楼主2024/3/13 11:41

RT,我想知道是不是因为我写的太菜了。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+10;
const int inf=1e9;
inline int _abs(int x){if(x>0) return x;return -x;}

struct BIT{
	int tree[N];
	int lowbit(int x){
		return x&(-x);
	}
	
	void modify(int pos,int val){
		while(pos<N){
			tree[pos]+=val;
			pos+=lowbit(pos);
		}
	}
	int query(int pos){
		int ans=0;
		while(pos){
			ans+=tree[pos];
			pos-=lowbit(pos);
		}
		return ans;
	}
}btree;

struct Query{
	int x,y,k,id;
	bool type;
}t[N*2],q1[N*2],q2[N*2]; int cnt;
int a[N],F[N];

void solve(int l,int r,int L,int R){
	if(l>r) return;
	if(L==R){
		for(int i=l;i<=r;i++){
			if(t[i].type) F[t[i].id]=L;
		}
		return;
	}
	int mid=(L+R)/2;
	int cnt1=0,cnt2=0;
	for(int i=l;i<=r;i++){
		if(!t[i].type){
			if(t[i].x<=mid){
				btree.modify(t[i].id,1);
				q1[++cnt1]=t[i];
			}else q2[++cnt2]=t[i];
		}else{
			int tmp=btree.query(t[i].y)-btree.query(t[i].x-1);
			if(tmp>=t[i].k) q1[++cnt1]=t[i];
			else{
				t[i].k-=tmp;
				q2[++cnt2]=t[i];
			}
		}
	}
	for(int i=1;i<=cnt1;i++) if(!q1[i].type) btree.modify(q1[i].id,-1);
	for(int i=1;i<=cnt1;i++) t[i+l-1]=q1[i];
	for(int i=1;i<=cnt2;i++) t[cnt1+l+i-1]=q2[i];
	solve(l,l+cnt1-1,L,mid);
	solve(l+cnt1,r,mid+1,R);
}

void fake_main(){
	int n,q; cin>>n>>q;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		t[++cnt]={a[i],1,inf,i,0};
	}
	for(int i=1;i<=q;i++){
		int l,r,k; cin>>l>>r>>k;
		t[++cnt]={l,r,k,i,1};
	}
	solve(1,cnt,-inf,inf);
	for(int i=1;i<=q;i++){
		cout<<F[i]<<"\n";
	}
}

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	int t; t=1;
	while(t--) fake_main();
}
2024/3/13 11:41
加载中...