题解 | #数字游戏#

数字游戏

https://ac.nowcoder.com/acm/contest/11217/A

G.空调遥控 不一样的解法 题目说当且仅当|a[i]-K|<=p时才能保证这个队员被满足,也就是说输入一个温度a[i],k在a[i]-p到a[i]+p这个区间内都会使这个队员被满足。。。

那我们就想到了什么?线段树啊!!用线段树维护区间的最大值,每输入一个温度a[i]就让a[i]-p和a[i]+p这个区间全部+1,而且这个线段树只需要update也不需要建树不需要查询,最后输出tree[1]就好了。

附上AC代码:(注:比赛的时候tree[node<<1|1]给我写成tree[node<<1]|1了然后调不过心态崩了,就没写)

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int add[3650000];
int tree[3650000];
int l,r;
void push_down(int node)
{
    if(!add[node])    return;
    add[node<<1] += add[node];
    add[node<<1|1]+=add[node];
    tree[node<<1]+=add[node];
    tree[node<<1|1]+=add[node];
    add[node] = 0;
}
void update(int start,int end,int node)
{
    if(l<=start&&r>=end)
    {
        tree[node]++;
        add[node]++;
        return;
    }
    push_down(node);
    int mid = (start+end)>>1;
    if(l<=mid) update(start,mid,node<<1);
    if(r>mid)  update(mid+1,end,node<<1|1);
    tree[node] = max(tree[node<<1],tree[node<<1|1]);
}

int main()
{
    int n,p,x;
    scanf("%d%d",&n,&p);
    for(int i = 1;i<=n;++i)
    {
        scanf("%d",&x);
        l = max(1,x-p);
        r = x+p;
        update(1,1000002,1);
    }
    cout<<tree[1]<<endl;
    return 0;
}
全部评论

相关推荐

吐泡泡的咸鱼:我也工作了几年了,也陆陆续续面试过不少人,就简历来说,第一眼学历不太够,你只能靠你的实习或者论文或者项目经历,然后你没有论文,没有含金量高的比赛和奖项,只能看实习和项目,实习来说,你写的实习经历完全不清楚你想找什么工作?行研?数据分析?且写的太少了,再看项目,这些项目先不说上过大学读过研究生的都知道很水,然后对你想找的岗位有什么帮助呢?项目和实习也完全不匹配啊,你好像在努力将你所有的经历都放在简历里想表现你的优秀,但是对于你想找的岗位来说,有什么用呢?最后只能获得岗位不匹配的评价。所以你需要明白你想要找的岗位要求是什么,是做什么的,比如产品经理,然后再看你的经历里有什么匹配的上这个岗位,或者对这个岗位以及这个岗位所在的公司有价值,再写到你的简历上
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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