解题思路:看到题目,经典的区间查询+区间修改,我们用线段树维护一段区间的最小值,每当有新的订单,我们就先查询订单时间范围内的最小教室数量,然后与Dj作比较,如果比dj小,那么我们可以标记为false,然后后面的操作都不用看了,因为他只要求输出第一个不满足的订单,否则就按照订单进行区间修改,即在该订单的开始时间和结束时间这个范围内都减少dj个教室。

Code:

#include<bits/stdc++.h>
using namespace std;typedef long long ll;
const int INF = 0x3f3f3f3f3f3f3f3f;
const int N = 1000005;
ll a[N],tree[N<<2],lazy[N<<2];
int n,m;void pushup(int k) {tree[k] = min(tree[k<<1],tree[k<<1|1]);//将父节点更新为较小的值
}void pushdown(int k) {if(lazy[k]) {lazy[k<<1] += lazy[k];lazy[k<<1|1] += lazy[k];tree[k<<1] += lazy[k];tree[k<<1|1] += lazy[k];lazy[k] = 0;}
}void build(int l,int r,int k) {if(l == r) {tree[k] = a[l];}else {int mid = l + ((r - l) >> 1);build(l,mid,k<<1);build(mid+1,r,k<<1|1);pushup(k);}
}void updata(int L, int R, int v, int l, int r,int k) {if(L <= l && r <= R) {tree[k] += v;lazy[k] += v;}else {pushdown(k);int mid = l + ((r - l) >> 1);if(L <= mid) {updata(L,R,v,l,mid,k<<1);}if(R > mid) {updata(L,R,v,mid+1,r,k<<1|1);}pushup(k);}
}ll query(int L,int R,int l,int r,int k) {if(L <= l && r <= R) {return tree[k];}else {pushdown(k);ll res = INF;int mid = l + ((r - l) >> 1);if(L <= mid) {res = min(res,query(L,R,l,mid,k<<1));}if(R > mid) {res = min(res,query(L,R,mid+1,r,k<<1|1));}return res;}
}int main()
{int u,v;ll w;
//  freopen("X:\Âå¹È²âÊÔÊý¾Ý\P1083_2.in","r",stdin);scanf("%d%d",&n,&m);memset(lazy,0,sizeof lazy);for(int i = 1;i <= n; ++i) {scanf("%lld",&a[i]);}build(1,n,1);int fg = 0;//这个标记是否已经不满足条件for(int i = 1;i <= m; ++i) {scanf("%lld%d%d",&w,&u,&v);if(fg)continue;int k = query(u,v,1,n,1);if(k < w) {fg = i;}else {updata(u,v,-w,1,n,1);}}if(!fg) {puts("0");}else {printf("-1\n%d\n",fg);}return 0;
}

FJUT 借教室 (线段树区间查询+区间修改)相关推荐

  1. A Simple Problem with Integers POJ - 3468(线段树+区间查询+区间修改+建树+懒惰标记模板)+(树状数组)

    题意: 有一个数组,有两种操作.1: Q a b 求[a,b]的和 2:C a b c 给[a,b] 的所有元素都加上c. 题目: You have N integers, A1, A2, ... , ...

  2. 线段树(区间修改,区间查询)

    线段树的区间修改 本题如果用单点修改的思想会T,所以需要引入一个数组lazylazylazy , 优秀程序员必备 lazylazylazy定义 此为偷懒 该数组意在储存 treetreetree 数组 ...

  3. 【线段树】区间修改(区间覆盖、区间权值加)标记下放操作的逻辑顺序

    洛谷传送门:月下"毛景树" 由于没有合适的题目,就从这道题入手,解此题时用到的算法/数据结构包括: 树链剖分 线段树(区间覆盖.区间加.区间查询.单点修改) 这道题被我调试了四个小 ...

  4. 线段树(区间修改)模板题 Luogu 2357 守墓人

    众所周知,线段树可以在O( log n)的时间内进行很多修改和查询的操作,应用很广. 线段树,顾名思义,是一个二叉树,但是每个节点,存的不是不是"数",而是一个"区间&q ...

  5. hihocoder #1078 : 线段树的区间修改

    解题思路:基础的线段树区间修改 我按照书上敲的代码不知道为什么WA... #include<iostream> #include<cstdio> #include<cst ...

  6. 线段树(区间修改 + 根节点查询):Just a Hook

    注意: 懒标记中当分裂的时候会进行pushdown,而pushdown中必定会将当前要被分裂的节点的懒标记值清为0,不留保留下来.因为保留下来的话,当下次进行分裂的时候,又会对此节点进行pushdow ...

  7. szu 寒训个人复习第一天 线段树入门单点修改,区间修改,以及线段树的扩展运用[线段树+dp][区间最大公约数]

    寒讯内容有点过多(其实是我太菜了)水一波怕忘了(人老了)**什么是线段树** 线段树是本蒟蒻感觉用处特别大的算法 那么线段树上面的节点表示什么意思呢? 线段树,上面的节点表示一个区间,父亲节点表示的区 ...

  8. 线段树(单点修改,区间查询)

    引入 题目描述题目描述题目描述 100001000010000个正整数,编号从111到100001000010000,用A[1]A[1]A[1],A[2]A[2]A[2],A[10000]A[1000 ...

  9. java-HDU1698(线段树的区间更新,和区间查询)

    HDU1698: 题目意思: Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

最新文章

  1. POJ 2778 DNA Sequence —— (AC自动机+矩阵快速幂)
  2. 南邮计算机科学与技术PK杭电,被985录取,却后悔没去杭电南邮,双非热门专业真的这么吃香吗?...
  3. 经典动态规划:0-1 背包问题
  4. 关于微信小程序使用wx.downloadFile和wx.getFileSystemManager().saveFile()保存文件在本机找不到文件的说明
  5. java多线程实战指南_学习笔记《Java多线程编程实战指南》二
  6. 《自然》年度十大人物:天才曹原居首 贺建奎来去匆匆
  7. (附源码)Flutter Demo
  8. 性能计数器驱动_Vulkan 探密:AMD Vulkan 开源驱动源码解析-零
  9. 解决VB6控件对象库未注册的问题
  10. 夜神模拟器安装激活面具magisk教程
  11. 驾校学员信息管理系统
  12. iOS App Store 审核 other 处理、解决办法 The review of your app is taking longer than expected
  13. ThreadPoolExecutor参数解析
  14. c语言哑铃,使用一副哑铃,做好8个动作,就能练遍全身肌肉
  15. 小白白之青龙面板搭建
  16. “一路向南,dream it possible”之旅--骑行从北京到成都(二)
  17. 【数据库】 MySQL备份恢复
  18. 同花顺l2数据接口到底有什么用?
  19. idea设置代码提示
  20. 嵌入式笔记24 命名空间 输入和输出 C++对C的升级

热门文章

  1. latex参考文献,首字母大写
  2. keras 中 reuse 问题
  3. pytorch:定义自己的网络结构
  4. JS 测试 Prototype
  5. VS2010 发布网站总是连同cs文件一起发布了
  6. angularjs1-7,供应商
  7. Java设计模式开篇
  8. 在github上参与开源项目日常流程
  9. Codeforces Round #248 (Div. 2) B. Kuriyama Mirai's Stones
  10. Window phone7 修改程序语言