首页 > 其他分享 >2023牛客OI赛前集训营-提高组(第二场)B.出租

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

时间:2023-10-10 20:56:48浏览次数:36  
标签:OI int tr 牛客 2023 集训营

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

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

目录

题目大意

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

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

思路

先思考一下 \(NO\) 的情况

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

作差得到 \(\sum_l^r(val - k) > k *d\)

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

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

#include <bits/stdc++.h>
#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;
}

标签:OI,int,tr,牛客,2023,集训营
From: https://www.cnblogs.com/2020fengziyang/p/17750314.html

相关文章

  • 【Android面试】2023最新面试专题六:Java并发编程(一)
    1、假如只有一个cpu,单核,多线程还有用吗?详细讲解享学课堂移动互联网系统课程:架构师筑基必备技能《线程与进程的理论知识入门1》这道题想考察什么?是否了解并发相关的理论知识考察的知识点cpu多线程的基本概念操作系统的调度任务机制CPU密集型和IO密集型理论考生应该如何回答CPU的执......
  • [NOIP2011 提高组] 铺地毯
    题目描述为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。一共有\(n\)张地毯,编号从\(1\)到\(n\)。现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上。地毯铺设......
  • 不都说金九银十嘛?为什么招聘软件上的Android岗位都变少了?
    前言刷知乎刷到了这样的一个话题,在北京裸辞三个多月都没有找到合适的工作,紧接着各种压力接踵而至,压的喘不过气,各种招聘网站看了个遍没有几个符合要求的工作,七八月没周都能约到两个到三个面试,到了九月感觉会好一点因为都说是金九银十,感觉自己机会要来了,结果九月更惨网站上的工作还没......
  • LY1376 [ 20231008 NOIP 模拟赛 T0 ] 递增路径
    题意\(A\),\(B\)两人轮流在一张图上移动一个点。要求这次移动的边权必须大于上次的。\(A\)希望游戏进行的轮数多,\(B\)希望游戏进行的轮数少。对于每个\(s=1,2,...,n\)作为起点,若双方都采用最优策略,游戏会进行多少轮。Sol考虑将所有边按照从大到小的顺序排序。每......
  • Selenium借助AutoIt完成文件的上传与下载
    文件上传1,编辑首先提前下载好AutoIT,先了解https://blog.csdn.net/weixin_39218743/article/details/87808776手上没有带上传文件的网址,先用百度的上传照片吧!打开AutoIT工具组件中的脚本编辑器sciTEScriptEditorWinWaitActive("打开")Send('D:\img\11.jpg')Sleep(2000)Send("{......
  • [UOJ618]【JOISC2021】聚会 2
    #618.【JOISC2021】聚会2就是相当于选中的点在整棵树上的重心首先,当\(i\)为奇数时,答案为\(1\)当\(i\)为偶数时,可以将选中的点分为两个子树,分别记其根节点为\(x\)和\(y\)那么可以发现,所以合法的\(x\)和\(y\)构成一个连通块,那么当前答案就是连通块的直径,且随着\(i\)的增大,连通......
  • Dockerfile 中的 CMD 与 ENTRYPOINT
    1、概述CMD和ENTRYPOINT指令都用于定义容器启动时执行的命令,单从功能上来看,这两个命令几乎是重复的,单独使用其中的一个就可以实现绝大多数的用例。尽管如此,它们在某些情况下具有不同的用途和优势。这篇文章旨在澄清它们的用法,以帮助你在实际应用中做出明智的选择,避免混淆。2......
  • Android 多个选项的弹出框的简单实现
    在布局页面添加一个fab按钮(fab_user_Add),可以简单的Button按钮就可以<cc.trity.floatingactionbutton.FloatingActionButtonandroid:id="@+id/fab_user_add"android:layout_width="50dp"android:layout_height="50dp&quo......
  • 洛谷P4158 [SCOI2009] 粉刷匠 题解
    所有的\(DP\),只要式子一推出来(不管复杂度),那就很简单了,因为优化是成千上万种的……思路1:我们考虑设\(f[i][j][k]\)表示:当前\(DP\)到第\(i\)块木板的第\(j\)个位置,共涂了\(k\)次,所能获得的最大收益。因为还要枚举当前这次涂是从哪到哪的,因此复杂度为\(O(NM^2T)\),实......
  • 洛谷P3300 [SDOI2013] 城市规划 题解
    [SDOI2013]城市规划题意:给你一个\(6\timesn\)的网格题,单点修改,询问区间联通块数,\(n\le10^5\)。解:看起来就很显然的一道题......线段树每个点用一个ufs维护连通性;我为了方便思考把图转成横着的了。写起来真是毒瘤......重点在于:\(\bullet\)1、建立叶节点。\(\bull......