大家都是怎么卡常的
查看原帖
大家都是怎么卡常的
1049302
i01eg楼主2023/8/9 22:08

代码都差不多,为什么我的主席树这么慢emm

#include<bits/stdc++.h>
using namespace std;
#define mid ((l+r)>>1)
#define ns (sum[lc[edn]]-sum[lc[edp]])
const int maxn=200010;
int now,sum[maxn<<5],lc[maxn<<5],rc[maxn<<5],n,m,a[maxn],drt[maxn],b[maxn],n1,czk,czl,czr,tt;
inline int build(int l,int r)
{
  int tp=++now;
  if(l==r)
    return tp;
  lc[tp]=build(l,mid);
  rc[tp]=build(mid+1,r);
  return tp;
}
int x;
inline int upd(int pre,int l,int r)
{
  int tp=++now;
  lc[tp]=lc[pre];
  rc[tp]=rc[pre];
  sum[tp]=sum[pre]+1;
  if(l==r)
    return tp;
  if(x<=mid)
    lc[tp]=upd(lc[pre],l,mid);
  else
    rc[tp]=upd(rc[pre],mid+1,r);
  return tp;
}
inline int query(int edp,int edn,int l,int r,int k)
{
  if(l==r)
    return l;
  if(ns>=k)
    return query(lc[edp],lc[edn],l,mid,k);
  else
    return query(rc[edp],rc[edn],mid+1,r,k-ns);  
}
int main()
{
  ios::sync_with_stdio("false");
  cin>>n>>m;
  for(int i=1;i<=n;i++)
  {
    cin>>a[i];
    b[i]=a[i];
  }
  sort(b+1,b+n+1);
  n1=unique(b+1,b+n+1)-b-1;
  drt[0]=build(1,n1);
  for(int i=1;i<=n;i++)
  {
  	x=lower_bound(b+1,b+n1+1,a[i])-b;
  	drt[i]=upd(drt[i-1],1,n1);
  }
  for(int i=1;i<=m;i++)
  {
  	cin>>czl>>czr>>czk;
  	tt=query(drt[czl-1],drt[czr],1,n1,czk);
  	cout<<b[tt]<<endl; 
  }
}

虽然能过但是时间比别人慢好多

2023/8/9 22:08
加载中...