/*
维护区间最小值
数据不超int 相反如果long long的话会有一组数据超时
无视掉 ll int
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 1000010
#define ll int
#define inf 0x7fffffff
using namespace std;
ll n,m,num,a[maxn],falg;
struct node
{
ll lc,rc,l,r,bj,ans;
}t[maxn*];
ll init()
{
ll x=;char s=getchar();
while(s<''||s>'')s=getchar();
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
return x;
}
void Build(ll li,ll ri)
{
ll k=++num;
t[k].l=li;t[k].r=ri;
if(li!=ri-)
{
t[k].lc=num+;
Build(li,(li+ri)/);
t[k].rc=num+;
Build((li+ri)/,ri);
t[k].ans=min(t[t[k].lc].ans,t[t[k].rc].ans);
}
else t[k].ans=a[li];
}
void update(ll k)
{
t[t[k].lc].ans-=t[k].bj;
t[t[k].rc].ans-=t[k].bj;
t[t[k].lc].bj+=t[k].bj;
t[t[k].rc].bj+=t[k].bj;
t[k].bj=;
}
void change(ll k,ll li,ll ri,ll p)
{
if(falg)return;
if(li<=t[k].l&&ri>=t[k].r)
{
t[k].ans-=p;
if(t[k].ans<)falg=;
t[k].bj+=p;
return;
}
if(t[k].bj)update(k);
if(li<(t[k].l+t[k].r)/)change(t[k].lc,li,ri,p);
if(ri>(t[k].l+t[k].r)/)change(t[k].rc,li,ri,p);
t[k].ans=min(t[t[k].lc].ans,t[t[k].rc].ans);
}
int main()
{
n=init();m=init();
for(int i=;i<=n;i++)
a[i]=init();
Build(,+n);
int x,y,z;
for(int i=;i<=m;i++)
{
falg=;
x=init();y=init();z=init();
change(,y,z+,x);
if(falg==)
{
printf("-1\n%d\n",i);
return ;
}
}
printf("0\n");
return ;
}
/*
后来听说二分快 果然快好多 - -
首先如果我们不会线段树的话 朴素的做法是对于每个询问 O(n)修改 O(n)查询
慢的很
差分这个东西可以实现O(2)的修改 O(n)还原 O(n)查询
优化一下的话 边还原边查询 这样就好多了
然后二分查询到哪一个任务
(反正考试的话我是想不到0.0)
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 1000010
using namespace std;
int n,m,ans,a[maxn],s[maxn];
struct node
{
int li,ri,ti;
}p[maxn];
bool can(int x)
{
memset(s,,sizeof(s));
int sum=;
for(int i=;i<=x;i++)
{
s[p[i].li]+=p[i].ti;
s[p[i].ri+]-=p[i].ti;
}
for(int i=;i<=n;i++)
{
sum+=s[i];
if(sum>a[i])return ;
}
return ;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
for(int i=;i<=m;i++)
scanf("%d%d%d",&p[i].ti,&p[i].li,&p[i].ri);
int l=,r=m;
while(l<=r)
{
int mid=(l+r)/;
if(can(mid)==)
{
ans=mid;
l=mid+;
}
else r=mid-;
}
if(!ans)printf("0\n");
else printf("-1\n%d",ans);
return ;
}

noip 2012 借教室 (线段树 二分)的更多相关文章

  1. 洛谷 P1083 [ NOIP 2012 ] 借教室 —— 线段树 / 二分差分数组

    题目:https://www.luogu.org/problemnew/show/P1083 当初不会线段树的时候做这道题...对差分什么不太熟练,一直没A,放在那儿不管... 现在去看,线段树就直接 ...

  2. NOIP2012借教室[线段树|离线 差分 二分答案]

    题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要 向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自 ...

  3. noip 借教室 线段树95分做法

    大致的思路是用线段树维护每个区间内部的最小值 段更新最小值 每次查某个区间的最小值是否满足租借要求 满足就借出去 update最小值 注意pushdown操作  还有一个从子区间提取答案的操作 提交地 ...

  4. 借教室 线段树and二分

    描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然希望 ...

  5. NOIP2012 D2 T2 借教室 线段树 OR 二分法

    题目描述: 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自 ...

  6. NOIP 2012 借教室

    洛谷 P1083 借教室 https://www.luogu.org/problem/P1083 JDOJ 1783: [NOIP2012]借教室 D2 T2 https://neooj.com/ol ...

  7. [vijos1782]借教室<线段树>

      题目链接:https://vijos.org/p/1782 题意:一个区间1,n.m次操作,每次操作让l,r区间值减去d,当有任何一个值小于0就输出当前是第几个操作 这道题其实是没有什么难度的,是 ...

  8. 【NOIP】提高组2012 借教室

    [算法]线段树||二分+前缀和 [题解]线段树记录区间加值和区间最大值. #include<cstdio> #include<algorithm> using namespac ...

  9. Codeforces Gym 100803G Flipping Parentheses 线段树+二分

    Flipping Parentheses 题目连接: http://codeforces.com/gym/100803/attachments Description A string consist ...

随机推荐

  1. 再次探究Android ListView缓存机制

    概述 虽然现在5.0后Google推出了RecycleView,但在5.0 Lollipop普及前Listview仍会被广泛使用,所以打算再次探究一下Listview的源码,了解一下Listview ...

  2. Oracle数据库还原方法

    Win +X → 运行→cmd C:\Documents and Settings\Administrator>sqlplus /nolog SQL> connect sys/passwo ...

  3. TCP/IP 三次握手和四次握手

    三次握手建立连接: 第一次握手:客户端发送syn包(seq=x)到服务器,并进入SYN_SEND状态,等待服务器确认: 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己 ...

  4. 关于如何在BCB中使用CodeGuard

    作者:深圳虫 来自:深圳虫网本文来自http://www.szbug.com/disparticle.aspID=4 一. 为什么写这篇东西自己在使用BCB5写一些程序时需要检查很多东西,例如内存泄漏 ...

  5. table 的边框变细

    table { border-width: 0px 0px 1px 1px; border-style:solid;border-color:black} td { border-width: 1px ...

  6. XFS文件系统功能解析

    XFS文件系统是作为一个日志文件系统开发,采用B-树平衡树算法来尽快地分配数据.主要的设计目的之一是支持大型文件和大型文件系统.当前,能够支持的最大文件大小是2艾字节,最大文件系统大小为8艾字节. X ...

  7. JavaScript框架设计 第14章 动画引擎

    easing-js <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...

  8. POJ 2112 Optimal Milking(Floyd+多重匹配+二分枚举)

    题意:有K台挤奶机,C头奶牛,每个挤奶机每天只能为M头奶牛服务,下面给的K+C的矩阵,是形容相互之间的距离,求出来走最远的那头奶牛要走多远   输入数据: 第一行三个数 K, C, M  接下来是   ...

  9. (转载)eclipse 快捷键大全,eclipse查找类,文件,添加注释

    (转载)http://hi.baidu.com/fegro/item/8224c8c28b174627ee466598   /* ----------------------------------- ...

  10. 【有源汇上下界费用流】BZOJ 3876 [Ahoi2014]支线剧情

    题目链接: http://www.lydsy.com:808/JudgeOnline/problem.php?id=3876 题目大意: 给定一张拓扑图(有向无环图),每条边有边权,每次只能从第一个点 ...