过了,但有个问题
查看原帖
过了,但有个问题
1184328
封禁用户楼主2024/4/5 20:49

有大佬帮忙看看以下两段代码的区别吗

40pt 代码:

#include<bits/stdc++.h>
using namespace std;
#define int unsigned long long
const int N=1e6+19;
int tr[N<<5],ls[N<<5],rs[N<<5],root[N],tot,a[N];

void build(int &x,int l,int r){
	x=++tot;
	if(l==r)
		return;
	int mid=(l+r)/2;
	build(ls[x],l,mid);
	build(rs[x],mid+1,r);
}

void insert(int u,int &x,int l,int r,int k){
	x=++tot;
	tr[x]=tr[u]+1,ls[x]=ls[u],rs[x]=rs[u];
	if(l==r)
		return;
	int mid=(l+r)/2;
	if(k<=mid)
		insert(ls[u],ls[x],l,mid,k);
	else insert(rs[u],rs[x],mid+1,r,k);
}

int query(int u,int x,int l,int r,int k){
	if(l==r)
		return l;
	int lx=tr[ls[x]]-tr[ls[u]];
	int mid=(l+r)/2;
	if(lx>=k)
		return query(ls[u],ls[x],l,mid,k);
	else return query(rs[u],rs[x],mid+1,r,k-lx);
}

signed main(){
	int n,m;
	scanf("%lld %lld",&n,&m);
	for(int i=1;i<=n;++i)
		scanf("%lld",&a[i]);
	build(root[0],1,N);
	for(int i=1;i<=n;++i)
		insert(root[i-1],root[i],1,N,a[i]);
	for(int i=1;i<=m;++i){
		int a,b,c;
		scanf("%lld %lld %lld",&a,&b,&c);
		printf("%lld\n",query(root[a-1],root[b],1,N,c));
	}
	return 0;
}

AC 代码:

#include<bits/stdc++.h>
using namespace std;
#define int unsigned long long
const int N=1e6+19;
int tr[N<<5],ls[N<<5],rs[N<<5],root[N],tot,a[N];

void build(int &x,int l,int r){
	x=++tot;
	if(l==r)
		return;
	int mid=(l+r)/2;
	build(ls[x],l,mid);
	build(rs[x],mid+1,r);
}

void insert(int u,int &x,int l,int r,int k){
	x=++tot;
	tr[x]=tr[u]+1,ls[x]=ls[u],rs[x]=rs[u];
	if(l==r)
		return;
	int mid=(l+r)/2;
	if(k<=mid)
		insert(ls[u],ls[x],l,mid,k);
	else insert(rs[u],rs[x],mid+1,r,k);
}

int query(int u,int x,int l,int r,int k){
	if(l==r)
		return l;
	int lx=tr[ls[x]]-tr[ls[u]];
	int mid=(l+r)/2;
	if(lx>=k)
		return query(ls[u],ls[x],l,mid,k);
	else return query(rs[u],rs[x],mid+1,r,k-lx);
}

signed main(){
	int n,m;
	scanf("%lld %lld",&n,&m);
	for(int i=1;i<=n;++i)
		scanf("%lld",&a[i]);
	build(root[0],0,N);
	for(int i=1;i<=n;++i)
		insert(root[i-1],root[i],0,N,a[i]);
	for(int i=1;i<=m;++i){
		int a,b,c;
		scanf("%lld %lld %lld",&a,&b,&c);
		printf("%lld\n",query(root[a-1],root[b],0,N,c));
	}
	return 0;
}

区别:

#include<bits/stdc++.h>
using namespace std;
#define int unsigned long long
const int N=1e6+19;
int tr[N<<5],ls[N<<5],rs[N<<5],root[N],tot,a[N];

void build(int &x,int l,int r){
	x=++tot;
	if(l==r)
		return;
	int mid=(l+r)/2;
	build(ls[x],l,mid);
	build(rs[x],mid+1,r);
}

void insert(int u,int &x,int l,int r,int k){
	x=++tot;
	tr[x]=tr[u]+1,ls[x]=ls[u],rs[x]=rs[u];
	if(l==r)
		return;
	int mid=(l+r)/2;
	if(k<=mid)
		insert(ls[u],ls[x],l,mid,k);
	else insert(rs[u],rs[x],mid+1,r,k);
}

int query(int u,int x,int l,int r,int k){
	if(l==r)
		return l;
	int lx=tr[ls[x]]-tr[ls[u]];
	int mid=(l+r)/2;
	if(lx>=k)
		return query(ls[u],ls[x],l,mid,k);
	else return query(rs[u],rs[x],mid+1,r,k-lx);
}

signed main(){
	int n,m;
	scanf("%lld %lld",&n,&m);
	for(int i=1;i<=n;++i)
		scanf("%lld",&a[i]);
	build(root[0],0,N);
  //40pt build(root[0],1,N);
	for(int i=1;i<=n;++i)
		insert(root[i-1],root[i],0,N,a[i]);
  		//40pt insert(root[i-1],root[i],1,N,a[i]);
	for(int i=1;i<=m;++i){
		int a,b,c;
		scanf("%lld %lld %lld",&a,&b,&c);
		printf("%lld\n",query(root[a-1],root[b],0,N,c));
     //40pt printf("%lld\n",query(root[a-1],root[b],1,N,c));
	}
	return 0;
}
2024/4/5 20:49
加载中...