换个角度思考

换个角度思考

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

前言:

这题假如用树状数组的话,还是很不错的一个题的.

思路:

直接把两个序列都按权值排序,把查询的以及原序列,这样做的好处就是保证我插入的一定是合法的,然后直接查询即可.

代码:

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+50;
struct Query{
    int l,r,k,id,ans;//询问区间[l,r]小于等于k的个数.存下查询时间轴以及答案.
}q[N],w[N];
int n,m,c[N];
int lowbit(int x)    { return x&(-x); }
void add(int u,int x)
{
    while(u<=n)
    {
        c[u]+=x;
        u+=lowbit(u);
    }
}

int ask(int u)
{
    int res=0;
    while(u)
    {
        res+=c[u];
        u-=lowbit(u);
    }return res;
}

bool cmp(Query A,Query B)
{
    return A.id<B.id;
}

bool cnp(Query A,Query B)
{
    return A.k<B.k;
}

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&w[i].k);
        w[i].id=i;
    }sort(w+1,w+1+n,cnp);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&q[i].l,&q[i].r,&q[i].k);
        q[i].id=i;
    }sort(q+1,q+1+m,cnp);int id=1;
    for(int i=1;i<=m;i++)
    {
        while(w[id].k<=q[i].k&&id<=n)    add(w[id].id,1),id++;
        q[q[i].id].ans=ask(q[i].r)-ask(q[i].l-1);
    }sort(q+1,q+1+m,cmp);
    for(int i=1;i<=m;i++)    printf("%d\n",q[i].ans);
    return 0;
}
lpt的小屋 文章被收录于专栏

我想要一份甜甜的爱情

全部评论
在计算出所有的q[q[i].id].ans后,不能进行sort(q+1,q+1+m,cmp);这个排序,因为你在存储ans时是按原来坐标的位置存储的,如果再对坐标排序会打乱原本正确的顺序,把sort(q+1,q+1+m,cmp);去掉应该就没问题了
1 回复 分享
发布于 2021-10-19 10:34

相关推荐

在写周报的打工人很独...:这个笔试昨天晚上做了一下,真难啊,前后端,ai全有
点赞 评论 收藏
分享
回家当保安:复旦✌🏻,佬你的简历感觉挺好的,寒假日常hc比较少。佬可以过完年之后再试试,日常实习hc比较充足
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

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