求助,TLE5个点
查看原帖
求助,TLE5个点
67817
MuYC楼主2020/5/29 15:41
#include <bits/stdc++.h>
using namespace std;
int c[200005],ans[210005];
int n,m;
struct node{int data,id;}b[200005],a[200005];
struct question{int l,r,k,address;}q[200005],lq[200005],rq[200005];
int lowbit(int x){return x&(-x);}
int add(int x,int k){
    while(x <= n)c[x]+=k,x+=lowbit(x);
    return 0;
}
int get(int x){
    int total=0;
    while(x > 0)total+=c[x],x-=lowbit(x);
    return total;
}
int cmp(node A,node B){
    if(A.data != B.data)
    return A.data<B.data;
    return A.id<B.id;
}
int solve(int cl,int cr,int l, int r){
    if(cl > cr)return 0;
    if(l == r){
        for (int i = cl ; i <= cr ; i++)
        ans[q[i].address]=b[l].data;
        return 0;
    }
    int mid=(l+r)/2,t1=0,t2=0;
    for (int i = 1 ; i <= n ; i ++)
    if(a[i].id <= mid)add(i,1);
    for (int i = cl ; i <= cr ; i ++){
        if(get(q[i].r)-get(q[i].l-1)>=q[i].k)
        t1++,lq[t1]=q[i];
        else 
        t2++,rq[t2]=q[i];
    }
    for (int i = 1 ; i <= n ; i ++)
    if(a[i].id <= mid)add(i,-1);
    for (int i = cl; i <= cl+t1-1 ; i ++)
    q[i]=lq[i-cl+1];
    for (int i = cl+t1 ; i <= cr ; i ++)
    q[i]=rq[i-cl-t1+1];
    solve(cl,cl+t1-1,l,mid),solve(cl+t1,cr,mid+1,r);
}
int main(){
    cin>>n>>m;
    for (int i = 1 ; i <= n ; i ++)
    cin>>a[i].id,b[i].data=a[i].id,b[i].id=i,a[i].data=a[i].id;
    sort(b+1,b+1+n,cmp);
    for (int i = 1 ; i <= n ; i ++)
    a[b[i].id].id=i;
    for (int i = 1 ; i <= m ; i ++)
    cin>>q[i].l>>q[i].r>>q[i].k,q[i].address=i;
    solve(1,m,0,n);
    for (int i = 1 ; i <= m ; i ++)
    cout<<ans[i]<<endl;
    return 0;
}
2020/5/29 15:41
加载中...