主席树单点修改

ps: from AgOH in B站

离散化
数组定义 a[]
临时数组 v
int cnt;
const int maxn;
int root[maxn];
struct hjt{
    int l,r,sum;
}h[40 * maxn];
int getid(int x){
    return lower_bound(v.begin(),v.end(),x)-v.begin()+1;
}

void insert(int l, int r, int pre, int now, int p){
    hjt[++cnt] = hjt[pre];
    now = cnt;
    hjt[now].sum ++;
    if(l==r) return;
    int m = l + r>>1;
    if(p<=m) insert(l, m, hjt[pre].l , hjt[now].l, p);
    else insert(m+1, r, hjt[pre].r, hjt[now].r , p);
}

int query(int l, int r, int L, int R, int k){
    if(l==r) return l;
    int m = l+r>>1;
    int tmp = hjt[hjt[R].l].sum - hjt[hjt[L-1]].sum;
    if(k<=tmp) return query(l, m, hjt[L].l, hjt[R].l, k);
    else return query(m+1, r, hjt[L].r , hjt[R].r , k-tmp);
}

int main(){
    for(int i =1;i<=n;i++){
        cin>>a[i]; v.push_back(a[i]);
    }

    for(int i=1;i<=n;i++){
        insert(1,n,root[i-1],root[i]);
    }

    for(int i=1;i<=m;i++){
        cin>>L>>R>>k;
        return v[query(1, n, L, R, k)-1];
    }
}















全部评论

相关推荐

找个工作&nbsp;学历是要卡的&nbsp;要求是高的&nbsp;技能不足是真的&nbsp;实习经验是0的&nbsp;简历无处可写是事实的&nbsp;钱不好赚是真的&nbsp;想躺平又不敢躺&nbsp;也不甘心躺&nbsp;怕自己的灵感和才华被掩埋甚至从未被自己发现&nbsp;又质疑自己是否真正有才华
码农索隆:你现在啊,你心里都明白咋回事,但是你没办法改变现状,一想到未来,你又没有信心狠下心来在当下努力。 得走出这种状态,不能一直困在那里面,哪不行就去提升哪,你一动不动那指定改变不了未来,动起来,积少成多才能越来越好
点赞 评论 收藏
分享
认真搞学习:28小登的建议,投算法岗不要写什么物理竞赛,互联网+,多写点项目,用什么算法做了什么。还有本科算法是不可能的开发你这个也没有项目啊
点赞 评论 收藏
分享
07-01 13:37
门头沟学院 Java
steelhead:不是你的问题,这是社会的问题。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务