求助——P3834,为什么样例不过(萌新刚学可持续化线段树,望大佬多包涵)?
  • 板块灌水区
  • 楼主wangding
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/4/24 22:51
  • 上次更新2024/4/25 15:16:24
查看原帖
求助——P3834,为什么样例不过(萌新刚学可持续化线段树,望大佬多包涵)?
1113248
wangding楼主2024/4/24 22:51

萌新代码可读性有点差,但还是希望大家能指教一下……

#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
int n,m,a[200005],le,ri,k,idx,root[200005];
vector<int> v;
struct segtree_node{
	int ch[3];
	int s;
}segtree[200005*22];
int getid(int x){
	return lower_bound(v.begin(),v.end(),x)-v.begin()+1;
}
void build(int l,int r,int &x){
	x=++idx;
	if(l==r) return;
	int m=(l+r)>>1;
	build(l,m,segtree[x].ch[0]);
	build(m+1,r,segtree[x].ch[1]);
}
void insert(int x,int &y,int l,int r,int v){
	y=++idx;
	segtree[y]=segtree[x];
	segtree[y].s++;
	if(l==r) return;
	int m=(l+r)>>1;
	if(v<=m) insert(segtree[x].ch[0],segtree[y].ch[1],l,m,v);
	else insert(segtree[x].ch[0],segtree[y].ch[1],m+1,r,v);
}
int query(int x,int y,int l,int r,int k){
	if(l==r) return l;
	int m=(l+r)>>1;
	int s=segtree[segtree[y].ch[0]].s-segtree[segtree[x].ch[0]].s;
	if(k==s) return query(segtree[x].ch[0],segtree[y].ch[1],l,m,k);
	else return  query(segtree[x].ch[0],segtree[y].ch[1],m+1,r,k-s);
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		v.push_back(a[i]);
	}
	sort(v.begin(),v.end());
	v.erase(unique(v.begin(),v.end()),v.end());
	build(1,n,root[1]);
	for(int i=1;i<=n;i++){
		insert(root[i-1],root[i],1,n,getid(a[i]));
	}
	for(int i=1;i<=m;i++){
		cin>>le>>ri>>k;
		int id=query(root[le-1],root[ri],1,n,k)-1;
		cout<<v[id]<<"\n";
	}
	return 0;
}

第二天晚上才能上洛谷,到时会关注……

2024/4/24 22:51
加载中...