问一下为啥双倍经验的过了,另一个OJ也过了,但是这题全RE
查看原帖
问一下为啥双倍经验的过了,另一个OJ也过了,但是这题全RE
808950
iqwl楼主2023/6/26 21:55
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

#define lc(x) t[x].ch[0]
#define rc(x) t[x].ch[1]

const int N = 2e5+5;

int root[N],idx;
struct Node
{
    int ch[2];
    int cnt;
}t[N*20];
int n,m,a[N];
vector<int>q;

int getid(int x)
{
    return lower_bound(q.begin(),q.end(),x)-q.begin()+1;
}

void build(int &x,int l,int r)
{
    x=++idx;
    if(l==r)return;
    int mid=(l+r)/2;
    build(lc(x),l,mid);
    build(rc(x),mid+1,r);
}

void insert(int x,int &y,int l,int r,int k)
{
    y=++idx;
    t[y]=t[x];//复制
    t[y].cnt++;//区域内点出现数++
    if(l==r)return;
    int mid=(l+r)/2;
    if(k<=mid)insert(lc(x),lc(y),l,mid,k);
    else insert(rc(x),rc(y),mid+1,r,k);
}

int query(int x,int y,int l,int r,int k)
{
    if(l==r)return l;
    int mid=l+r>>1;
    int s=t[lc(y)].cnt-t[lc(x)].cnt;
    if(k<=s)query(lc(x),lc(y),l,mid,k);
    else query(rc(x),rc(y),mid+1,r,k-s);
}
int main()
{
    scanf("%d%d",&n,&m);
    
    //build(root[0],1,n);
    
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        q.push_back(a[i]);
    }
    
    sort(q.begin(),q.end());
    q.erase(unique(q.begin(),q.end()),q.end());
    int qn=q.size();
    
    for(int i=1;i<=n;i++)
        insert(root[i-1],root[i],1,qn,getid(a[i]));
        
    while(m--)
    {
        int l,r,k;
        scanf("%d%d%d",&l,&r,&k);
        int id=query(root[l-1],root[r],1,qn,k)-1;
        printf("%d\n",q[id]);
    }
    return 0;
}
2023/6/26 21:55
加载中...