这道题我读完题目的第一感觉是:

这不就是个线段树??用线段树维护区间最小值,检查是否满足订单要求即可判断。

对于修改操作直接在区间上进行。

据说会卡一卡线段树,但是貌似写一个懒标记,连zkw线段树都不用,然后读优,什么的随便卡卡就可以A了

后来想了想,就这么显然的直接拿线段树去A题显然没什么意义,于是决定想一波正解

正解的一般解法都是差分前缀和+二分

当然主要都是二分。

然后我绞尽脑汁不知道怎么写,后来发现是不会算复杂度限制了我的想象力。

二分天数十分显然,在1~m间二分,对于每一个mid,我们假定,订单就一定会在这一天出锅,然后剩下的就是判断这一天会不会出锅。

对于判断的方式,我们另开一个数组,记录类似订单能够为总的教室数量贡献或是拿走的信息

我们假设这个数组是room_add,order_l, order_r, order_room分别代表订单从第order_l天开始到第order_r天结束,每天借order_room间教室

对于每份订单:在room_add[order_l[i]]上加上order_room, 相应的,在room_add[order_r[i]+1]上减去order_room

分别表示订单在order_l天得到了order_room间教室,而在order_r天失去了order_room间教室,也就是为下一个订单提供了order_room间教室。

我们很容易想到,对于两份相邻的订单,若是后一份订单得到的教室加上前一份订单失去的教室的数量比a[i](a[i]表示每天能提供的教室数量)还大,说明我们肯定无法满足后一份订单,就出锅了。

但是我们二分的是在哪一天出锅,所以这个时候我们要把二分范围缩小

反之扩大

最后如果二分结束后r等于m,就表示中间一定有出过锅,导致r的范围缩小了

详细见代码实现

 #include<bits/stdc++.h>
#define ll long long
#define uint unsigned int
using namespace std;
const int maxn = ;
struct shiki {
int l, r;
int room;
}order[maxn];
int n, m;
int a[maxn], room_add[maxn]; inline int read() {
int x = , y = ;
char ch = getchar();
while(!isdigit(ch)) {
if(ch == '-') y = -;
ch = getchar();
}
while(isdigit(ch)) {
x = (x << ) + (x << ) + ch - '';
ch = getchar();
}
return x * y;
} inline bool check(int aim_day) {
memset(room_add, , sizeof(room_add));
for(register uint i = ; i <= aim_day; ++i) {
room_add[order[i].l] += order[i].room;
room_add[order[i].r + ] -= order[i].room;
}
for(register uint i = ; i <= n; ++i) {
room_add[i] += room_add[i - ];
if(room_add[i] > a[i]) return true;
}
return false;
} int main() {
n = read(), m = read();
for(int i = ; i <= n; ++i)
a[i] = read();
for(int i = ; i <= m; ++i)
order[i].room = read(), order[i].l = read(), order[i].r = read();
int l = , r = m;
while(l < r) {
int mid = l + r >> ;
if(check(mid)) r = mid;
else l = mid + ;
}
if(r != m) cout << - << '\n' << l << '\n';
else cout << << '\n';
return ;
}

luogu P1038借教室【Noip提高组2012】的更多相关文章

  1. NOIP提高组2004 合并果子题解

    NOIP提高组2004 合并果子题解 描述:在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消 ...

  2. Luogu 1083 借教室(二分,差分)

    Luogu 1083 借教室(二分,差分) Description 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要 向学校申请借教室.教室的大小功能不同,借教室人的身份不 ...

  3. 计蒜客 NOIP 提高组模拟竞赛第一试 补记

    计蒜客 NOIP 提高组模拟竞赛第一试 补记 A. 广场车神 题目大意: 一个\(n\times m(n,m\le2000)\)的网格,初始时位于左下角的\((1,1)\)处,终点在右上角的\((n, ...

  4. 1043 方格取数 2000 noip 提高组

    1043 方格取数  2000 noip 提高组 题目描述 Description 设有N*N的方格图(N<=10,我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0.如下图所示(见样 ...

  5. [NOIP提高组2018]货币系统

    [TOC] 题目名称:货币系统 来源:2018年NOIP提高组 链接 博客链接 CSDN 洛谷博客 洛谷题解 题目链接 LibreOJ(2951) 洛谷(P5020) 大视野在线评测(1425) 题目 ...

  6. NOIP提高组初赛难题总结

    NOIP提高组初赛难题总结 注:笔者开始写本文章时noip初赛新题型还未公布,故会含有一些比较老的内容,敬请谅解. 约定: 若无特殊说明,本文中未知数均为整数 [表达式] 表示:在表达式成立时它的值为 ...

  7. 津津的储蓄计划 NOIp提高组2004

    这个题目当年困扰了我许久,现在来反思一下 本文为博客园ShyButHandsome的原创作品,转载请注明出处 右边有目录,方便快速浏览 题目描述 津津的零花钱一直都是自己管理.每个月的月初妈妈给津津\ ...

  8. 2018.12.30【NOIP提高组】模拟赛C组总结

    2018.12.30[NOIP提高组]模拟赛C组总结 今天成功回归开始做比赛 感觉十分良(zhōng)好(chà). 统计数字(count.pas/c/cpp) 字符串的展开(expand.pas/c ...

  9. 2018.12.08【NOIP提高组】模拟B组总结(未完成)

    2018.12.08[NOIP提高组]模拟B组总结 diyiti 保留道路 进化序列 B diyiti Description 给定n 根直的木棍,要从中选出6 根木棍,满足:能用这6 根木棍拼出一个 ...

随机推荐

  1. mplab c30 注册方法

    http://blog.csdn.net/q553716434/article/details/7459036 关键文件是: C:\Program Files\Microchip\MPLAB C30\ ...

  2. 理解First Chance和Second Chance避免单步调试

    原文链接地址:http://blog.csdn.net/Donjuan/article/details/3859160 在现在C++.Java..Net代码大行其道的时候,很多代码错误(Bug)都是通 ...

  3. [Leetcode] Binary tree maximum path sum求二叉树最大路径和

    Given a binary tree, find the maximum path sum. The path may start and end at any node in the tree. ...

  4. [AHOI2005]航线规划——LCT维护边双联通分量

    因为只能支持加入一个边维护边双,所以时光倒流 维护好边双,每次就是提取出(x,y)的链,答案就是链长度-1 具体维护边双的话, void access(int x){ for(reg y=0;x;y= ...

  5. 【BZOJ 3316】JC loves Mkk 01分数规划+单调队列

    单调栈不断吞入数据维护最值,数据具有单调性但不保证位置为其排名,同时可以按照进入顺序找出临近较值单调队列队列两端均可删除数据但只有队末可以加入数据,仍然不断吞入数据但同时可以额外刨除一些不符合条件的数 ...

  6. [SDOI2016] 排列计数 (组合数学)

    [SDOI2016]排列计数 题目描述 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰 ...

  7. lwIP配置文件opt.h和lwipopts.h

    如何去配置lwip,使它去适合不同大小的脚,这就是lwIP的配置问题.尤其是内存的配置,配置多了浪费,配置少了跑不了或者不稳定(会出现的一大堆莫名奇妙的问题,什么打开网页的速度很慢啊?什么丢包啊,什么 ...

  8. Qt 设置应用程序图标(windows)

    Step 1: 创建  xxx.rc 文件. 将ico图标文件复制到项目根目录下.然后在该目录中新建xxx.rc文件,并输入一行代码: IDI_ICON1 ICON DISCARDABLE " ...

  9. PHP正则替换preg_replace函数的使用

    <?php $str="as2223adfsf0s4df0sdfsdf"; echo preg_replace("/0/","",$s ...

  10. [BZOJ2190&BZOJ2705]欧拉函数应用两例

    欧拉函数phi[n]是表示1~n中与n互质的数个数. 可以用公式phi[n]=n*(1-1/p1)*(1-1/p2)*(1-1/p3)...*(1-1/pk)来表示.(p为n的质因子) 求phi[p] ...