/*
维护区间最小值
数据不超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. pecl安装php的ev扩展时的报错处理

    pecl安装php的ev扩展,安装完毕后php.ini中加入扩展extension=ev.so,然后重启php-fpm出现以下报错 PHP Warning:  PHP Startup: Unable ...

  2. Ubiquitous Religions(并查集)

    Description There are so many different religions in the world today that it is difficult to keep tr ...

  3. 【HDOJ】3295 An interesting mobile game

    其实就是一道搜索模拟题.因为数据量小,用char就够了. /* 3295 */ #include <iostream> #include <cstdio> #include & ...

  4. 【Linux】鸟哥的Linux私房菜基础学习篇整理(十)

    1. at [-mldv] TIME/at -c 工作号码:单一工作调度.参数:-m:当at的工作完成后,即使没有输出信息,以email通知用户该工作已完成:-l:相当于atq,列出目前系统上面的所有 ...

  5. bzoj3505

    ans=C((n+1)*(m+1),3)-三点一线的情况横线竖线我们可以先去掉然后考虑斜线,由于对称性我们只要考虑斜率大于0的即可有一个很显然的结论,但两点坐标差为x,y时,这条线段上的点数为gcd( ...

  6. weblogic服务器保存图片失败解决办法

    日志中报错如下: java.lang.NoClassFoundError: Could not initialize class sun.awt.X11GraphicsEnvironment 解决办法 ...

  7. 【动态规划】HDU 5791 Two

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5791 题目大意: A,B两个数列,问A的子集和B的子集相等的子集对数.子集内顺序按照数列顺序,相同的 ...

  8. 【离线】【深搜】【树】Codeforces 707D Persistent Bookcase

    题目链接: http://codeforces.com/problemset/problem/707/D 题目大意: 一个N*M的书架,支持4种操作 1.把(x,y)变为有书. 2.把(x,y)变为没 ...

  9. QTP关于AOM的Javascript启动方式

    序 QTP的AOM模型想必大家都很熟悉了,平时常用的就是通过VBS脚本的方式编写启动程序(也是我现在用的方法).其实,还有很多其他的方式,如Java,C#,JS,这些语言都是通过调用QTObjectM ...

  10. a为整型数组,&a+1的含义

    #include <stdio.h> int main() { int a[10]; printf("a的值为:\t%d\n",a); printf("&am ...