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 ...
随机推荐
- 十月例题F题 - City Game
F - City Game Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Bob is a st ...
- 用C++进行函数式编程
http://www.programmer.com.cn/12717/ 文 / John Carmack 译 / 王江平 <Quake>作者Carmack认为追求函数式的程序设计有着实 ...
- 最新game
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <signal.h&g ...
- js 实现 di
前些时候有使用过AngularJS一些时间,最大的感受就是Angular完全颠覆了我们开发Web应用的方式,自己被其许多耳目一新的设计思想所折服. 首先想说的就是依赖注入(DI),这也意味着,你在使用 ...
- nginx 配置多个主机
<pre name="code" class="html"> server { listen 8001; server_name localhost ...
- 【ZOJ】3430 Detect the Virus
动态建树MLE.模仿别人的代码模板各种原因wa后,终于AC. #include <iostream> #include <cstdio> #include <cstrin ...
- 物理卷操作命令:pvcreate,pvscan,pvdisplay.卷组操作命令:vgcreate,vgdisplay.
新硬盘创建LVM系统过程. 物理卷操作命令:pvcreate,pvscan,pvdisplay. 卷组操作命令:vgcreate,vgdisplay. 逻辑卷操作命令:lvcreate,lvdispl ...
- Linux负载均衡软件LVS之一(概念篇)
一. LVS简介 LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver ...
- find the mincost route(floyd变形 无向图最小环)
Time Limit: 1000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...
- 数据结构(线段树):CodeForces 85D Sum of Medians
D. Sum of Medians time limit per test 3 seconds memory limit per test 256 megabytes input standard i ...