题目大意:

  有一个n个数的数列,m个操作,第i个操作使[li,ri]区间建di,问第几个操作使数列中出现负数。

思路:

  暴力显然过不了,那么就可以优化了,不难想到线段树,显然需要良好的姿势,那么就差分。

  a[i]表示第i天比第i-1天多了多少房间,于是a的前缀和即为该天的房间数量。而a的维护显然为a[li]+=di,a[ri+1]-=di。

  因为求最前的操作,于是我们可以二分答案。但如此常数比较大,又有冗余,可以来个栈一样的东西节省时间。

  但是有大神想到了O(n+m)的算法。假设m个指令都可满足,天数从前往后判断,再从后往前一个一个删除指令,直到无负数为止。

代码:

  二分:

 #include<cstdio>
const int M=;
int n,m,i,k,h,t,sum,last,a[M],l[M],r[M],d[M],b[M];
bool can; int read()
{
int x=;
char ch=getchar();
while (ch<'' || ch>'') ch=getchar();
while (ch>='' && ch<='') x=(x<<)+(x<<)+ch-,ch=getchar();
return x;
} int main()
{
n=read(),m=read();
for (i=;i<=n;++i) b[i]=read();
for (i=;i<=m;++i) d[i]=read(),l[i]=read(),r[i]=read();
for (h=,t=m;h<t;)
{
m=h+t>>;
if (m>last) for (i=last+;i<=m;++i) a[l[i]]=a[l[i]]+d[i],a[r[i]+]=a[r[i]+]-d[i];
else if (m<last) for (i=m+;i<=last;++i) a[l[i]]=a[l[i]]-d[i],a[r[i]+]=a[r[i]+]+d[i];
for (last=m,sum=,i=can=;i<=n;++i)
{
sum=sum+a[i];
if (sum>b[i]) { can=; break; }
}
if (can) h=m+; else t=k=m;
}
if (k) printf("-1\n%d\n",k);
else printf("0\n");
return ;
}

  O(n+m):

 #include<cstdio>
const int M=;
int n,m,i,x,cnt,a[M],b[M],l[M],r[M],d[M]; int read()
{
int x=; char ch=getchar();
while (ch<'' || ch>'') ch=getchar();
while (ch>='' && ch<='') x=(x<<)+(x<<)+ch-,ch=getchar();
return x;
} int main()
{
n=read(),m=read();
for (i=;i<=n;++i) a[i]=(b[i]=read())-b[i-];
for (i=;i<=m;++i) d[i]=read(),a[l[i]=read()]=a[l[i]]-d[i],a[(r[i]=read())+]=a[r[i]+]+d[i];
for (x=m,i=;i<=n;++i)
for (cnt=cnt+a[i];cnt<;--m)
if (l[m]>i) a[l[m]]=a[l[m]]+d[m],a[r[m]+]=a[r[m]+]-d[m];
else if (r[m]>=i) cnt=cnt+d[m],a[r[m]+]=a[r[m]+]-d[m];
if (m<x) printf("-1\n%d\n",m+);
else printf("0\n");
return ;
}

[NOIP2012]借教室 题解的更多相关文章

  1. NOIP2012 借教室 题解 洛谷P1083

    一看就是暴力 好吧,其实是线段树或差分+二分,这里用的是差分+二分的做法. 二分部分的代码,套个二分板子就行 ,right=m; while(left<right)//二分 { ; ; else ...

  2. 洛谷P1083 借教室 题解

    题目 [NOIP2012 提高组] 借教室 题解 这道题是几周之前做到的一道题,本来不想讲的,因为这道题也是用到了二分答案的方法,这类题目之前已经发布过两篇题解了.但这道题还运用了差分数组这个思想,所 ...

  3. NC16564 [NOIP2012]借教室

    NC16564 [NOIP2012]借教室 题目 题目描述 ​ 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借 ...

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

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

  5. NOIP 2012 Day2T2 借教室题解

    NOIP 2012 Day2T2 借教室题解 题目传送门:http://codevs.cn/problem/1217/ 题目描述 Description 在大学期间,经常需要租借教室.大到院系举办活动 ...

  6. [NOIP2012提高]借教室 题解(二分答案+差分)

    [NOIP2012提高&洛谷P1083]借教室 Description 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室 ...

  7. NOIP2012 借教室

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

  8. NOIP2012 借教室 Splay初探

    终于把区间操作的Splay搞明白了…… Splay的大致框架是这样的: [代码中的Zig-Zig和Zig-Zag操作其实是可以优化的,实际只需要3次passDown和3次update] templat ...

  9. noip借教室 题解

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

随机推荐

  1. HTTP超文本传输协议-HTTP/1.1中文版

    摘要 超文本传输协议(HTTP)是一种为分布式,合作式,多媒体信息系统服务,面向应用层的协议.它是一种通用的,不分状态(stateless)的协议,除了诸如名称服务和分布对象管理系统之类的超文本用途外 ...

  2. WIN7 + IIS7 Service Unavailable HTTP Error 503. The service is unavailable.

    在win7上开启IIS功能,进行网站发布. 但是开启IIS之后,打开默认网站都打不开,显示 Service Unavailable HTTP Error 503. The service is una ...

  3. mysql常用操作语句

    mysql常用操作语句 1.mysql -u root -p   2.mysql -h localhost -u root -p database_name 2.列出数据库: 1.show datab ...

  4. awk 的使用方法

    awk 的使用方法 我们知道 awk 的常用变量包括: $0 当前记录(这个变量中存放着整个行的内容) $1~$n 当前记录的第 n个字段,字段间由 FS 分隔 NF 当前记录中的字段个数,就是有多少 ...

  5. [UML]UML系列——用例图Use Case

    用例图的概念 用例图是描述用例.参与者以及它们之间关系的图. 用例图的作用 用例图是从用户的角度来描述对信息系统的需求,分析产品的功能和行为. 用例图定义和描述了系统的外部可见行为,是分析.设计直至组 ...

  6. fedora23的打印服务

    cups: common unix printing system. 是通用的打印服务. whatever 不管什么; whichever: 不管哪个 可以使用 http://localhost:63 ...

  7. Chrome 用户数据配置文件夹保存路径在哪?(Mac OS X/Windows/Linux)

    在重装系统之前都想要对 Chrome 中的数据进行备份,以能够在重装系统后恢复这些数据.但是除了一些玩 Chrome 很长时间的用户,鲜有人知道 Chrome 的用户数据到底保存在什么地方.如果你也有 ...

  8. H5案例分享:移动端滑屏 touch事件

    移动端滑屏 touch事件 移动端触屏滑动的效果的效果在电子设备上已经被应用的越来越广泛,类似于PC端的图片轮播,但是在移动设备上,要实现这种轮播的效果,就需要用到核心的touch事件.处理touch ...

  9. 在android程序中加入widget(窗口小部件)并与之交互的关键代码

    摘要: widget(窗口小部件)可以增强应用程序的交互性, 是很多应用中都会用到的功能,本文不求大而全,但是会给出程序与widget交互的关键代码 正文: 其实widget是嵌入(embedded) ...

  10. python匹配ip正则

    python匹配ip正则 #!/usr/bin/env python # -*- coding:utf-8 -*- import re ip_str = "asdad1.1.1.1sdfwe ...