码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 2023牛客OI赛前集训营-提高组(第二场)B.出租


    2023牛客OI赛前集训营-提高组(第二场)B.出租

    B-出租_2023牛客OI赛前集训营-提高组(第二场) (nowcoder.com)

    文章目录

    • 2023牛客OI赛前集训营-提高组(第二场)B.出租
      • 题目大意
      • 思路

    题目大意

    在一条路上有 n n n 个栋楼,每栋楼上有 k k k 个房间出租。

    现在有 m m m 次询问,每次有两个数字 x , y x , y x,y ,询问区间 [ x , x + d ] [x , x +d] [x,x+d] 上是否有 y y y 个房间空闲。

    思路

    先思考一下 N O NO NO 的情况

    如果存在 [ l , r ] [l , r] [l,r] 租户人数的和大于 k ∗ ( r − l + 1 + d ) k * (r - l + 1 + d) k∗(r−l+1+d) ,说明无解

    作差得到 ∑ l r ( v a l − k ) > k ∗ d \sum_l^r(val - k) > k *d ∑lr​(val−k)>k∗d

    所以我们只需要用线段树维护最大字段和和 k ∗ d k *d k∗d 比大小就好了

    注意: 即便不能满足某组租户也要把它们记录下来。

    #include 
    #define LL long long
    #define fu(x , y , z) for(int x = y ; x <= z ; x ++)
    #define lp p << 1
    #define rp p << 1 | 1
    using namespace std;
    const int N = 5e5 + 5;
    const LL mod = 1e18 + 5;
    int n , m , k , d;
    struct Tr {
        LL ml , mr , mx , v;
    } tr[N << 2];
    void build (int p , int l , int r) {
        if (l == r) tr[p].v = -k;
        else {
            int mid = l + r >> 1;
            build (lp , l , mid);
            build (rp , mid + 1 , r);
            tr[p].v = tr[lp].v + tr[rp].v;
        }
    }
    void change (int p , int l , int r , int x , LL val) {
        if (l == r && l == x) {
            tr[p].v += val;
            tr[p].ml = tr[p].mr = tr[p].mx = tr[p].v;
        }
        else {
            int mid = l + r >> 1;
            if (x <= mid) change (lp , l , mid , x , val);
            else change (rp , mid + 1 , r , x , val);
            tr[p].v = tr[lp].v + tr[rp].v;
            tr[p].ml = max (tr[lp].ml , tr[rp].ml + tr[lp].v);
            tr[p].mr = max (tr[rp].mr , tr[lp].mr + tr[rp].v);
            tr[p].mx = max (tr[lp].mr + tr[rp].ml , max (tr[lp].mx , tr[rp].mx));
        }
    }
    int main () {
        // freopen ("11.in" , "r" , stdin);
        // freopen ("111.out" , "w" , stdout);
        int x;
        LL y;
        scanf ("%d%d%d%d" , &n , &m , &k , &d);
        build (1 , 1 , n);
        fu (i , 1 , m) {
            scanf ("%d%lld" , &x , &y);
            change (1 , 1 , n , x , y);
            if (tr[1].mx > 1ll * k * d) puts ("NO");
            else puts ("YES");
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
  • 相关阅读:
    猿创征文|深度剖析复杂的菱形继承与菱形虚拟继承
    怎么把m4v转换为mp4?
    python面向对象———类,继承
    C++静态成员&友元&命名空间介绍
    软件设计师2015上午题基础知识(易错整理)
    C++ 函数模板
    KubeVela交付
    携创教育:自考本科要考哪些科目?自考专升本有什么优势?
    Java教程:如何利用UDP实现群聊聊天室?
    Python面试宝典:Python中与常用的机器学习库相关的面试笔试题(1000加面试笔试题助你轻松捕获大厂Offer)
  • 原文地址:https://blog.csdn.net/fzyyyyyyyy/article/details/133691090
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号