每日一题 4.30 换个角度思考

换个角度思考

https://ac.nowcoder.com/acm/problem/19427

看题目后 不会呀数据结构 (巨佬队友说是主席树的板子题
果断向他学习了一下 下面是我的学习理解
主席树相当于线段树1-1,1-2,1-n的前缀和 于是这样就可以用来维护区间信息
将 l-r变为 1-l 1-r的减法
套上板子 这题维护的信息是区间的名次

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int n,m;
int a[maxn];
vector<int>v[maxn<<2];
vector<int>::iterator it;
void build(int id,int l,int r)
{
    v[id].clear();
    for(int i=l;i<=r;++i) v[id].push_back(a[i]);
    sort(v[id].begin(),v[id].end());
    if(l==r) return;
    int mid=(l+r)>>1;
    build(id<<1,l,mid);
    build(id<<1|1,mid+1,r);
}
int query(int id,int L,int R,int l,int r,int h)
{
    if(l<=L&&R<=r)
    {
        it=upper_bound(v[id].begin(),v[id].end(),h);
        return it-v[id].begin();
    }
    int mid=(L+R)>>1;
    int ans=0;
    if(l<=mid) ans+=query(id<<1,L,mid,l,r,h);
    if(mid<r) ans+=query(id<<1|1,mid+1,R,l,r,h);
    return ans;
}
int main()
{
    int T,t=1;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;++i) scanf("%d",&a[i]);
    build(1,1,n);
    int l,r,h;
    while(m--)
    {
        scanf("%d%d%d",&l,&r,&h);
        printf("%d\n",query(1,1,n,l,r,h));
    }
    return 0;
}
每日一题题解 文章被收录于专栏

每日一题题解的汇集

全部评论

相关推荐

昨天 15:08
门头沟学院 Java
春招第一枪拷打实习挑一个项目介绍一下手撕归并排序
滴滴滴d:我昨天也面了,感觉答得还行,结果秒挂
查看2道真题和解析
点赞 评论 收藏
分享
来个offer吧求求求了:校园经历和要找到工作有半毛钱关系?
点赞 评论 收藏
分享
浪子陪都:简历最优秀的地方放到了后面,国奖,校级奖学金这些是最亮眼的。说明你跟同级别的学生不一样。 建议台灯这个,PCB布局布线这个词汇不专业,业内是PCB Layout,第二,单片机的板子一般不用考虑SI,PI 都是低速信号,只要遵循3W原则就好了。 单片机的项目太low了,技能这块,你要看一下BOSS直聘的招聘要求,按照别人的要求写,一些关键词可以增加你简历被检索到的概率。 主修课程不用写,这个没有人去关注的。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务