社区讨论
洛谷AC,poj上WA了是什么鬼?
P3834【模板】可持久化线段树 2参与者 3已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mi6okjc3
- 此快照首次捕获于
- 2025/11/20 08:15 4 个月前
- 此快照最后确认于
- 2025/11/20 08:15 4 个月前
如题,附上代码。
CPP#include<cstdio>
#include<algorithm>
using namespace std;
struct Seg{
int val;
Seg *ch[2];
Seg(){
ch[0]=ch[1]=NULL;
val=0;
}
void maintain(){
val=ch[0]->val+ch[1]->val;
return;
}
}*root[5010];
struct node{
int val,idx;
bool operator<(const node b)const{
return val<b.val;
}
}a[100010];
inline int rd(){
register int x=0,y=1;
char c;
do{
c=getchar();
if(c=='-')
y=-y;
}while(c<'0'||c>'9');
do{
x=(x<<1)+(x<<3)+(c^48);
c=getchar();
}while(c>='0'&&c<='9');
return x;
}
inline void build(Seg *o,int l,int r){
if(l==r)
return;
int mid=(l+r)>>1;
o->ch[0]=new Seg();
o->ch[1]=new Seg();
build(o->ch[0],l,mid);
build(o->ch[1],mid+1,r);
return;
}
int n,m,c[100010],ans[100010];
inline void updata(Seg *o,int l,int r,int x){
if(l==r){
o->val=1;
return;
}
int mid=(l+r)>>1,d=x>mid;
Seg *p=o->ch[d];
o->ch[d]=new Seg();
*o->ch[d]=*p;
if(d==1)
updata(o->ch[1],mid+1,r,x);
else updata(o->ch[0],l,mid,x);
o->maintain();
return;
}
inline int query(Seg *L,Seg *R,int l,int r,int x){
if(l==r)
return ans[l];
int mid=(l+r)>>1,lval=R->ch[0]->val-L->ch[0]->val;
if(x>lval)
return query(L->ch[1],R->ch[1],mid+1,r,x-lval);
return query(L->ch[0],R->ch[0],l,mid,x);
}
int main(){
n=rd();
m=rd();
for(int i=1;i<=n;i++){
a[i].val=rd();
a[i].idx=i;
}
sort(a+1,a+n+1);
for(int i=1;i<=n;i++){
ans[i]=a[i].val;
a[i].val=i;
}
for(int i=1;i<=n;i++)
c[a[i].idx]=a[i].val;
root[0]=new Seg();
build(root[0],1,n);
for(int i=1;i<=n;i++){
root[i]=new Seg();
*root[i]=*root[i-1];
updata(root[i],1,n,c[i]);
}
for(int i=1;i<=m;i++){
int l=rd(),r=rd(),k=rd();
printf("%d\n",query(root[l-1],root[r],1,n,k));
}
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...