luogu P1038借教室【Noip提高组2012】


这道题我读完题目的第一感觉是:
这不就是个线段树??用线段树维护区间最小值,检查是否满足订单要求即可判断。
对于修改操作直接在区间上进行。
据说会卡一卡线段树,但是貌似写一个懒标记,连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】的更多相关文章
- NOIP提高组2004 合并果子题解
NOIP提高组2004 合并果子题解 描述:在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消 ...
- Luogu 1083 借教室(二分,差分)
Luogu 1083 借教室(二分,差分) Description 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要 向学校申请借教室.教室的大小功能不同,借教室人的身份不 ...
- 计蒜客 NOIP 提高组模拟竞赛第一试 补记
计蒜客 NOIP 提高组模拟竞赛第一试 补记 A. 广场车神 题目大意: 一个\(n\times m(n,m\le2000)\)的网格,初始时位于左下角的\((1,1)\)处,终点在右上角的\((n, ...
- 1043 方格取数 2000 noip 提高组
1043 方格取数 2000 noip 提高组 题目描述 Description 设有N*N的方格图(N<=10,我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0.如下图所示(见样 ...
- [NOIP提高组2018]货币系统
[TOC] 题目名称:货币系统 来源:2018年NOIP提高组 链接 博客链接 CSDN 洛谷博客 洛谷题解 题目链接 LibreOJ(2951) 洛谷(P5020) 大视野在线评测(1425) 题目 ...
- NOIP提高组初赛难题总结
NOIP提高组初赛难题总结 注:笔者开始写本文章时noip初赛新题型还未公布,故会含有一些比较老的内容,敬请谅解. 约定: 若无特殊说明,本文中未知数均为整数 [表达式] 表示:在表达式成立时它的值为 ...
- 津津的储蓄计划 NOIp提高组2004
这个题目当年困扰了我许久,现在来反思一下 本文为博客园ShyButHandsome的原创作品,转载请注明出处 右边有目录,方便快速浏览 题目描述 津津的零花钱一直都是自己管理.每个月的月初妈妈给津津\ ...
- 2018.12.30【NOIP提高组】模拟赛C组总结
2018.12.30[NOIP提高组]模拟赛C组总结 今天成功回归开始做比赛 感觉十分良(zhōng)好(chà). 统计数字(count.pas/c/cpp) 字符串的展开(expand.pas/c ...
- 2018.12.08【NOIP提高组】模拟B组总结(未完成)
2018.12.08[NOIP提高组]模拟B组总结 diyiti 保留道路 进化序列 B diyiti Description 给定n 根直的木棍,要从中选出6 根木棍,满足:能用这6 根木棍拼出一个 ...
随机推荐
- 常见的位运算技巧总结(膜wys)
看了wys的论文,感觉获得了不少新姿势 这里总结一下 #include <iostream> using namespace std; typedef unsigned int u32; ...
- [LeetCode] decode ways 解码方式
A message containing letters fromA-Zis being encoded to numbers using the following mapping: 'A' -&g ...
- 洛谷 [CQOI2015]选数 解题报告
[CQOI2015]选数 题目描述 我们知道,从区间\([L,H]\)(\(L\)和\(H\)为整数)中选取\(N\)个整数,总共有\((H-L+1)^N\)种方案. 小\(z\)很好奇这样选出的数的 ...
- 《软件调试的艺术》学习笔记——GDB使用技巧摘要
<软件调试的艺术>学习笔记——GDB使用技巧摘要 <软件调试的艺术>,因为名是The Art of Debugging with GDB, DDD, and Eclipse. ...
- BZOJ1875: [SDOI2009]HH去散步 图上边矩乘
这道题十分的坑…… 我作为一只连矩乘都不太会的渣渣看到这道题就只能神搜了….. 首先说一下普通的矩乘求方案,就是高出邻接矩阵然后一顿快速幂….. 矩乘一般就是一些秘制递推….. 再说一下这道题,我们可 ...
- SICAU-OJ:要我唱几首歌才能够将你捕捉
要我唱几首歌才能够将你捕捉 题意: 有N种颜色的牛,现在可以执行以下两种操作: 1.抓捕一只牛,代价为ai: 2.花费x的代价使用魔法,让所有颜色加1,N会变为1. 求得到N种颜色的牛最少花费的代价. ...
- lwIP RAW_API
lwIP RAW TCP/IP接口 作者: Adam Dunkels, Leon Woestenberg, Christiaan Simons lwIP为使用TCP/IP协议通信的应用程序编程提供了两 ...
- 关于CRC循环冗余校验的总结(C#)
1. 实验要求 (1)通过CRC(循环冗余校对)序列的计算,掌握C#语言中类的静态方法与动态方法的区别. (2)Shell与Windows Form 的通信作为扩展提高内容. 2. 实验内容 主要工 ...
- HDU1596 find the safest road---(最短路径dijkstra,#变形#)
http://acm.hdu.edu.cn/showproblem.php?pid=1596 分析: 题目要找一条安全度最高的路,安全度计算方法 Safe(P) = s(e1)*s(e2)…*s ...
- hdu 6223 Infinite Fraction Path
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=6223 题意:给定长度为n的一串数字S,现在要按照一种规则寻找长度为n的数字串,使得该数字串的字典序最大 ...