FJUT 借教室 (线段树区间查询+区间修改)
解题思路:看到题目,经典的区间查询+区间修改,我们用线段树维护一段区间的最小值,每当有新的订单,我们就先查询订单时间范围内的最小教室数量,然后与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 借教室 (线段树区间查询+区间修改)相关推荐
- 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, ... , ...
- 线段树(区间修改,区间查询)
线段树的区间修改 本题如果用单点修改的思想会T,所以需要引入一个数组lazylazylazy , 优秀程序员必备 lazylazylazy定义 此为偷懒 该数组意在储存 treetreetree 数组 ...
- 【线段树】区间修改(区间覆盖、区间权值加)标记下放操作的逻辑顺序
洛谷传送门:月下"毛景树" 由于没有合适的题目,就从这道题入手,解此题时用到的算法/数据结构包括: 树链剖分 线段树(区间覆盖.区间加.区间查询.单点修改) 这道题被我调试了四个小 ...
- 线段树(区间修改)模板题 Luogu 2357 守墓人
众所周知,线段树可以在O( log n)的时间内进行很多修改和查询的操作,应用很广. 线段树,顾名思义,是一个二叉树,但是每个节点,存的不是不是"数",而是一个"区间&q ...
- hihocoder #1078 : 线段树的区间修改
解题思路:基础的线段树区间修改 我按照书上敲的代码不知道为什么WA... #include<iostream> #include<cstdio> #include<cst ...
- 线段树(区间修改 + 根节点查询):Just a Hook
注意: 懒标记中当分裂的时候会进行pushdown,而pushdown中必定会将当前要被分裂的节点的懒标记值清为0,不留保留下来.因为保留下来的话,当下次进行分裂的时候,又会对此节点进行pushdow ...
- szu 寒训个人复习第一天 线段树入门单点修改,区间修改,以及线段树的扩展运用[线段树+dp][区间最大公约数]
寒讯内容有点过多(其实是我太菜了)水一波怕忘了(人老了)**什么是线段树** 线段树是本蒟蒻感觉用处特别大的算法 那么线段树上面的节点表示什么意思呢? 线段树,上面的节点表示一个区间,父亲节点表示的区 ...
- 线段树(单点修改,区间查询)
引入 题目描述题目描述题目描述 100001000010000个正整数,编号从111到100001000010000,用A[1]A[1]A[1],A[2]A[2]A[2],A[10000]A[1000 ...
- java-HDU1698(线段树的区间更新,和区间查询)
HDU1698: 题目意思: Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
最新文章
- POJ 2778 DNA Sequence —— (AC自动机+矩阵快速幂)
- 南邮计算机科学与技术PK杭电,被985录取,却后悔没去杭电南邮,双非热门专业真的这么吃香吗?...
- 经典动态规划:0-1 背包问题
- 关于微信小程序使用wx.downloadFile和wx.getFileSystemManager().saveFile()保存文件在本机找不到文件的说明
- java多线程实战指南_学习笔记《Java多线程编程实战指南》二
- 《自然》年度十大人物:天才曹原居首 贺建奎来去匆匆
- (附源码)Flutter Demo
- 性能计数器驱动_Vulkan 探密:AMD Vulkan 开源驱动源码解析-零
- 解决VB6控件对象库未注册的问题
- 夜神模拟器安装激活面具magisk教程
- 驾校学员信息管理系统
- iOS App Store 审核 other 处理、解决办法 The review of your app is taking longer than expected
- ThreadPoolExecutor参数解析
- c语言哑铃,使用一副哑铃,做好8个动作,就能练遍全身肌肉
- 小白白之青龙面板搭建
- “一路向南,dream it possible”之旅--骑行从北京到成都(二)
- 【数据库】 MySQL备份恢复
- 同花顺l2数据接口到底有什么用?
- idea设置代码提示
- 嵌入式笔记24 命名空间 输入和输出 C++对C的升级