noip 2012 借教室 (线段树 二分)
/*
维护区间最小值
数据不超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 借教室 (线段树 二分)的更多相关文章
- 洛谷 P1083 [ NOIP 2012 ] 借教室 —— 线段树 / 二分差分数组
题目:https://www.luogu.org/problemnew/show/P1083 当初不会线段树的时候做这道题...对差分什么不太熟练,一直没A,放在那儿不管... 现在去看,线段树就直接 ...
- NOIP2012借教室[线段树|离线 差分 二分答案]
题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要 向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自 ...
- noip 借教室 线段树95分做法
大致的思路是用线段树维护每个区间内部的最小值 段更新最小值 每次查某个区间的最小值是否满足租借要求 满足就借出去 update最小值 注意pushdown操作 还有一个从子区间提取答案的操作 提交地 ...
- 借教室 线段树and二分
描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然希望 ...
- NOIP2012 D2 T2 借教室 线段树 OR 二分法
题目描述: 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自 ...
- NOIP 2012 借教室
洛谷 P1083 借教室 https://www.luogu.org/problem/P1083 JDOJ 1783: [NOIP2012]借教室 D2 T2 https://neooj.com/ol ...
- [vijos1782]借教室<线段树>
题目链接:https://vijos.org/p/1782 题意:一个区间1,n.m次操作,每次操作让l,r区间值减去d,当有任何一个值小于0就输出当前是第几个操作 这道题其实是没有什么难度的,是 ...
- 【NOIP】提高组2012 借教室
[算法]线段树||二分+前缀和 [题解]线段树记录区间加值和区间最大值. #include<cstdio> #include<algorithm> using namespac ...
- Codeforces Gym 100803G Flipping Parentheses 线段树+二分
Flipping Parentheses 题目连接: http://codeforces.com/gym/100803/attachments Description A string consist ...
随机推荐
- 常见的三种Web服务架构
常见的三种Web服务架构 转自http://www.cnblogs.com/bvbook/archive/2008/12/24/1360942.html 相互竞争的服务架构 The Competing ...
- [BZOJ 1816] [Cqoi2010] 扑克牌 【二分答案】
题目链接:BZOJ - 1816 题目分析 答案具有可以二分的性质,所以可以二分答案. 验证一个答案 x 是否可行,就累加一下各种牌相对于 x 还缺少的量,如果总和超过了 x 或 m ,就不可行. 因 ...
- angular2 学习笔记 (Pipes)
Pipe 就是 ng1 的 filter <pre>{{ jsonValue | json }}</pre> 用法看这里就很清楚了 : https://angular.cn/d ...
- 人在江湖飘,哪能不挨刀。CENTOS之后,UBUNTU,FEDORA都要安装起来作测试啊
还好,我们有VIRTUAL BOX.
- IOS中用模型取代字典的好处
使用字典的坏处 一般情况下,设置数据和取出数据都是用“字符串类型的key”,编写这些key时,编译器不会有任何友情提示,需要手敲 dict[@“name”]=@“Kevin”; NSString *n ...
- UIAutomation识别UI元素
MS UI Automation(Microsoft User Interface Automation:UIA)是随.net framework3.0一起发布的,虽然在如今这个几乎每天都有各种新名词 ...
- java中String s="abc"及String s=new String("abc")详解
1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 2. 栈的优势是,存取速度比堆要快,仅次于直 ...
- open和fopen的区别(转)
转载自:http://www.cnblogs.com/joeblackzqq/archive/2011/04/11/2013010.html open和fopen的区别: 1.缓冲文件系统缓 冲文件系 ...
- vijos1514天才的记忆
P1514天才的记忆 背景 神仙飞啊飞 描述 从前有个人名叫W and N and B,他有着天才般的记忆力,他珍藏了许多许多的宝藏.在他离世之后留给后人一个难题(专门考验记忆力的啊!),如果谁能轻松 ...
- Watch OS2.0开发概述
(注:尊重劳动成果,转载请注明出处 http://www.cnblogs.com/xiaochunle/p/4620230.html ) Watch OS 2.0时代 北京时间2015年6月9日,WW ...