1217 借教室 2012年NOIP全国联赛提高组

时间限制: 1 s

空间限制: 128000 KB

题目等级 : 钻石 Diamond

题目描述 Description

在大学期间,经常需要租借教室。大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室。教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样。

面对海量租借教室的信息,我们自然希望编程解决这个问题。

我们需要处理接下来n天的借教室信息,其中第i天学校有ri个教室可供租借。共有m份订单,每份订单用三个正整数描述,分别为dj, sj, tj,表示某租借者需要从第sj天到第tj天租借教室(包括第sj天和第tj天),每天需要租借dj个教室。

我们假定,租借者对教室的大小、地点没有要求。即对于每份订单,我们只需要每天提供dj个教室,而它们具体是哪些教室,每天是否是相同的教室则不用考虑。

借教室的原则是先到先得,也就是说我们要按照订单的先后顺序依次为每份订单分配教

室。如果在分配的过程中遇到一份订单无法完全满足,则需要停止教室的分配,通知当前申

请人修改订单。这里的无法满足指从第sj天到第tj天中有至少一天剩余的教室数量不足dj个。

现在我们需要知道,是否会有订单无法完全满足。如果有,需要通知哪一个申请人修改

订单。

输入描述 Input Description

第一行包含两个正整数n, m,表示天数和订单的数量。

提高组 day2

第二行包含n个正整数,其中第i个数为ri,表示第i天可用于租借的教室数量。

接下来有m行,每行包含三个正整数dj, sj, tj,表示租借的数量,租借开始、结束分别在

第几天。

每行相邻的两个数之间均用一个空格隔开。天数与订单均用从1开始的整数编号。

输出描述 Output Description

如果所有订单均可满足,则输出只有一行,包含一个整数 0。否则(订单无法完全满足)

输出两行,第一行输出一个负整数-1,第二行输出需要修改订单的申请人编号。

样例输入 Sample Input

4 3

2 5 4 3

2 1 3

3 2 4

4 2 4

样例输出 Sample Output

-1

2

数据范围及提示 Data Size & Hint

【输入输出样例说明】

classroom.out

-1

2

第 1 份订单满足后,4 天剩余的教室数分别为 0,3,2,3。第 2 份订单要求第 2 天到

第 4 天每天提供 3 个教室,而第 3 天剩余的教室数为 2,因此无法满足。分配停止,通知第

2 个申请人修改订单。

【数据范围】

对于 10%的数据,有1 ≤ n, m ≤ 10;

对于 30%的数据,有1 ≤ n, m ≤ 1000;

对于 70%的数据,有1 ≤ n, m ≤ 105;

对于 100%的数据,有1 ≤ n, m ≤ 10^6, 0 ≤ ri, dj≤ 10^9, 1 ≤ sj≤ tj≤ n。

分类标签 Tags 点此展开

线段树 树结构 大陆地区 NOIP全国联赛提高组 2012年

  1. /*
  2. 线段树区间维护min.
  3. */
  4. #include<iostream>
  5. #include<cstdio>
  6. #include<cstdlib>
  7. #define MAXN 1000001
  8. #define LL long long
  9. using namespace std;
  10. LL cut,n,m,a[MAXN],flag;
  11. struct data{
  12. LL l,r,lc,rc,sum,bj;
  13. }tree[MAXN*4];
  14. LL read(){
  15. LL x=0,f=1;char ch=getchar();
  16. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  17. while(ch>='0'&&ch<='9')x=x*10+ch-48,ch=getchar();
  18. return x*f;
  19. }
  20. void build(LL l,LL r){
  21. LL k=++cut;tree[k].l=l,tree[k].r=r;
  22. if(l==r)
  23. { tree[k].sum=read();
  24. return ;
  25. }
  26. LL mid=(l+r)>>1;
  27. tree[k].lc=cut+1;
  28. build(l,mid);
  29. tree[k].rc=cut+1;
  30. build(mid+1,r);
  31. tree[k].sum=min(tree[tree[k].lc].sum,tree[tree[k].rc].sum);
  32. }
  33. void pushdown(LL k){
  34. tree[tree[k].lc].bj+=tree[k].bj;
  35. tree[tree[k].rc].bj+=tree[k].bj;
  36. tree[tree[k].lc].sum-=tree[k].bj;
  37. tree[tree[k].rc].sum-=tree[k].bj;
  38. //if(tree[tree[k].lc].sum<0)flag=1;
  39. //if(tree[tree[k].rc].sum<0)flag=1;
  40. tree[k].bj=0;
  41. }
  42. void add(LL k,LL l,LL r,LL data){
  43. if(flag) return ;
  44. if(l<=tree[k].l&&tree[k].r<=r){
  45. tree[k].bj+=data;
  46. tree[k].sum-=data;
  47. if(tree[k].sum<0) flag=1;
  48. return ;
  49. }
  50. if(tree[k].bj) pushdown(k);
  51. LL mid=(tree[k].l+tree[k].r)>>1;
  52. if(l<=mid) add(tree[k].lc,l,r,data);
  53. if(r>mid) add(tree[k].rc,l,r,data);
  54. tree[k].sum=min(tree[tree[k].lc].sum,tree[tree[k].rc].sum);
  55. }
  56. int main(){
  57. LL x,y,z;
  58. n=read();m=read();
  59. build(1,n);
  60. for(LL i=1;i<=m;i++){
  61. x=read();y=read();z=read();add(1,y,z,x);
  62. if(flag) {
  63. printf("-1\n%d",i);
  64. exit(0);
  65. }
  66. }
  67. printf("0");
  68. return 0;
  69. }

Codevs 1217 借教室 2012年NOIP全国联赛提高组的更多相关文章

  1. Codevs 1218 疫情控制 2012年NOIP全国联赛提高组

    1218 疫情控制 2012年NOIP全国联赛提高组 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description H 国有 n 个城市,这 ...

  2. Codevs 1198 国王游戏 2012年NOIP全国联赛提高组

    1198 国王游戏 2012年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 恰逢 H 国国庆,国王邀 ...

  3. Codevs 1200 同余方程 2012年NOIP全国联赛提高组

    1200 同余方程 2012年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 求关于 x 同余方程 a ...

  4. 开车旅行 2012年NOIP全国联赛提高组(倍增+set)

    开车旅行 2012年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond     题目描述 Description 小A 和小B决定利用 ...

  5. Codevs 3286 火柴排队 2013年NOIP全国联赛提高组 树状数组,逆序对

    题目:http://codevs.cn/problem/3286/ 3286 火柴排队  2013年NOIP全国联赛提高组  时间限制: 1 s   空间限制: 128000 KB   题目等级 : ...

  6. Codevs 1069 关押罪犯 2010年NOIP全国联赛提高组

    1069 关押罪犯 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description S 城现有两座监狱,一共 ...

  7. Codevs 3731 寻找道路 2014年 NOIP全国联赛提高组

    3731 寻找道路 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 在有向图G中,每条边的长度均为1,现给定起点和终点,请你在图中找 ...

  8. Codevs 3287 货车运输 2013年NOIP全国联赛提高组(带权LCA+并查集+最大生成树)

    3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description A 国有 n 座 ...

  9. codevs 1058 合唱队形 2004年NOIP全国联赛提高组

    1058 合唱队形 2004年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold   题目描述 Description N位同学站成一排,音 ...

随机推荐

  1. SVM 支持向量机

          学习策略:间隔最大化(解凸二次规划的问题) 对于上图,如果采用感知机,可以找到无数条分界线区分正负类,SVM目的就是找到一个margin 最大的 classifier,因此这个分界线(超平 ...

  2. linux select 与 阻塞( blocking ) 及非阻塞 (non blocking)实现io多路复用的示例

    除了自己实现之外,还有个c语言写的基于事件的开源网络库:libevent http://www.cnblogs.com/Anker/p/3265058.html 最简单的select示例: #incl ...

  3. MSSQL效率优化随记

    1.尽量不要在where中进行计算,尤其是需要遍历的情况原来代码,执行大约40秒 INSERT INTO @TransferCode ( PROXY_NO, TING_NO, WTotal, BTot ...

  4. 页面接口防刷 解决思路一nginx

    线上环境 很多接口 如果不做缓存 可能导致有人拿到url  每秒几万次的访问后台程序,导致系统down机. 此处, nginx可以加一层缓存. expires起到控制页面缓存的作用,合理的配置expi ...

  5. 从bug中学习怎么写代码

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:从bug中学习怎么写代码.

  6. time_t和struct tm之间的转换

    time_t到struct tm的转换: #include <time.h> struct tm *localtime(const time_t *timep); struct tm到ti ...

  7. 利用Continuous Testing实现Eclipse环境自己主动单元測试

    当你Eclipse环境中改动项目中的某个方法时,你可能因为各种原因没有执行单元測试,结果代码提交,悲剧就可能随之而来. 所幸infinitest(http://infinitest.github.io ...

  8. ASM集群文件系统ACFS(ASM Cluster File System)

    在11g R2中ASM文件支持包括数据文件,控制文件,归档日志文件,spfile,RMAN备份文件,Change Tracking文件,数据泵Dump文件盒OCR文件等.而推出的ACFS和Oracle ...

  9. dubbo与spring mvc

    安装 一.本地服务     1.定义服务接口: (该接口需单独打包,在服务提供方和消费方共享) public interface CustomerService { public String get ...

  10. Effective C# Chapter1-Language Elements

    <EffectiveC#>这本书讲了一些关于C#语言的使用技巧和经验. 该系列文章是备忘录和自己的一些见解.程序猿们最喜欢这类问题了,欢迎讨论~ 菜单 Item 1 使用属性取代公共成员变 ...