题目

这个难度感觉并没有那么高,因为这个题暴力也好打,但是比较难想出正解,因为如果你不看标签是很难想到这个题竟然是二分,当然前缀和应该很好想,毕竟让你求的是在某段时间内借教室的和是否满足。

这样我们可以很容易的推出借的教室的个数和订单是成正对应的,因此他可以满足单调性,所以我们就可以用上二分。

而原题中我们可以把天数看成x轴上的横坐标,这天的借教室数可以看成y轴上的纵坐标,而每一次订单的增加,我们就要让从第一个订单到这个订单中的所有订单都加起来,这就像一个区间修改,然后我们在判断的时候就需要用到单点查询这天满不满足。

因此我们可以想到差分数组和前缀和的结合,然后再搭配二分,就ok了。

代码:

// luogu-judger-enable-o2
#include<iostream>
#include<cstring>
#include<cstdio>
#define M 1000010
using namespace std;
struct cym {
int l ,r, d;
} e[M];
int delta[M], sum[M], nul[M], n, m;
bool flag;
bool check(int x) {
memset(delta, , sizeof(delta));
for(int i = ; i <= x; i++) {
delta[e[i].l] += e[i].d;
delta[e[i].r + ] -= e[i].d;
}
for(int i = ; i <= n; i++) {
sum[i] = sum[i - ] + delta[i];
if(sum[i] > nul[i])
return false;
}
return true;
}
int main() {
scanf("%d%d", &n, &m);
for (int i = ; i <= n; i++)
scanf ("%d", &nul[i]);
for (int i = ; i <= m; i++)
scanf ("%d%d%d", &e[i].d, &e[i].l, &e[i].r);
for(int i = ; i <= m; i++) {
delta[e[i].l] += e[i].d;
delta[e[i].r + ] -= e[i].d;
}
for(int i = ; i <= n; i++) {
sum[i] = sum[i - ] + delta[i];
if(sum[i] > nul[i])
flag = ;
}
if(!flag)
{
printf("");
return ;
}
int left = , right = m;
while (left < right) {
int mid = (left+right) / ;
if (check(mid))
left = mid + ;
else
right = mid;
}
printf ("-1\n%d", left);
}

最新文章

  1. 提高代码质量系列之二:重构小技巧——if篇
  2. SAP 设置屏幕字段的隐藏、显示、必填和可选,以设置物料组为例
  3. Yii2 使用小部件 Breadcrumbs
  4. PostgreSQL 列出所有表名和数据库名
  5. js中有趣的闭包(closure)
  6. 【POJ 3176】Cow Bowling
  7. JAVA 打印九九乘法表
  8. java.util.Dictionary源码分析
  9. AndroidStudio 更新gradle Error:Failed to complete Gradle execution. Cause: Connection reset
  10. HBase HFileBlock
  11. HDU-1078
  12. php,apache伪静态(1转)
  13. Excel里函数中的万金油,你确定不要点进来看看?
  14. Java I/O---IO流的规律小结
  15. ELK 6.2.4搭建
  16. centos7修改网卡名称为eth0
  17. ssh自动登录,脚本实现
  18. keepalived的vip无法ping通【原创】
  19. Freemarker导出带多个不重复图片的word
  20. java 与 或 非 异或 &amp; | ~ ^

热门文章

  1. 编剧小记 — Contour
  2. 关于NETCORE中的捆绑与最小化 以及与CDN连用
  3. koa2实现session的两种方式(基于Redis 和MySQL)
  4. java 8中抽象类与接口的异同
  5. C#格式化字符串大全
  6. bootstrap简单使用
  7. YOLO.h5 下载
  8. Oracle Flashback 详解
  9. CIFS 与 SMB 有什么区别?
  10. 1.Java简介