[NOIP2012提高&洛谷P1083]借教室

Description

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

我们需要处理接下来n天的借教室信息,其中第i天学校有ri个教室可供租借。共有m份订单,每份订单用三个正整数描述,分别为dj,sj,tj,表示某租借者需要从第sj天到第tj天租借教室(包括第sj天和第tj天),每天需要租借dj个教室。我们假定,租借者对教室的大小、地点没有要求。即对于每份订单,我们只需要每天提供dj个教室,而它们具体是哪些教室,每天是否是相同的教室则不用考虑。

借教室的原则是先到先得,也就是说我们要按照订单的先后顺序依次为每份订单分配教室。如果在分配的过程中遇到一份订单无法完全满足,则需要停止教室的分配,通知当前申请人修改订单。这里的无法满足指从第sj天到第tj天中有至少一天剩余的教室数量不足dj个。

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

输入格式:

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

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

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

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

输出格式:

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

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

Solution

1.显然本题是可以用线段树做的,本篇在此不讨论线段树做法,只讨论差分数组+二分答案做法;

2.首先,判断当前状态所有任务均可满足的条件为每天需求教室量在允许范围内,那么我们处理的方式是用差分数组记录每一次当前状态各个任务在每天对教室的总需求量和前一天该值的差值,那么根据差分数组的性质可以求得每一天的实际需求值,即第i天的需求值n[i]=Σ(1≤k≤i)f[i],与当天题目给出的允许教室数量比对,若大于提供量,返回错,因为每次比对是按天顺序的,我们可以用一个变量求各天的当前任务实际需求值,其具体实现如下(f为差分数组,ok为允许的各天的教室数,j为循环当天的需求值):

bool valid(int x){
memset(need,0,sizeof(need));
memset(f,0,sizeof(f));
for(i=1;i<=x;++i){
f[a[i].s]+=a[i].w;
f[a[i].t+1]-=a[i].w;
}
for(i=1;i<=n;++i){
need[i]=need[i-1]+f[i];
if(need[i]>ok[i])return false;
}
return true;
}

3.根据题目叙述,检测一下m种任务同时执行是否可行,若可行直接输出0return;

4.若不可以,我们就要二分答案,显然此时的横坐标轴为任务数,二分答案判断(valid函数方式同上)直至该状态所有任务都可满足即可,注意若采用mid=(l+r+1)/2的方式二分的话答案要加一,采用mid=(l+r)/2的方式二分直接输出所查找到的解即可;

#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,i,j,k,maxn=0,f[1001000],ok[1000100];
struct node{
int s,t,w;
}a[1001000]; bool valid(int x){
memset(f,0,sizeof(f));
for(i=1;i<=x;++i){
f[a[i].s]+=a[i].w;
f[a[i].t+1]-=a[i].w;
}
j=0;
for(i=1;i<=n;++i){
j+=f[i];
if(j>ok[i])return false;
}
return true;
}
int main(){
memset(f,0,sizeof(f));
scanf("%d%d",&n,&m);
for(i=1;i<=n;++i)scanf("%d",&ok[i]);
for(i=1;i<=m;++i)scanf("%d%d%d",&a[i].w,&a[i].s,&a[i].t);
if(valid(m)){printf("0\n");return 0;}
int l=1,r=m;
while(l<r){
int mid=(l+r)/2;
if(valid(mid)) l=mid+1;
else r=mid;
}
printf("-1\n%d\n",l);
return 0;
}

二分答案的基础参考以前的随笔:http://www.cnblogs.com/COLIN-LIGHTNING/p/8543330.html

差分数组的基础参考以前的随笔:http://www.cnblogs.com/COLIN-LIGHTNING/p/8436624.html

[NOIP2012提高]借教室 题解(二分答案+差分)的更多相关文章

  1. Luogu P1083 借教室【二分答案/差分】By cellur925

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

  2. Luogu 1083 借教室(二分,差分)

    Luogu 1083 借教室(二分,差分) Description 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要 向学校申请借教室.教室的大小功能不同,借教室人的身份不 ...

  3. 洛谷P1083 借教室 题解

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

  4. 洛谷 P1083 借教室 题解

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

  5. NOIP 2012 Day2T2 借教室题解

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

  6. cogs 2109. [NOIP 2015] 运输计划 提高组Day2T3 树链剖分求LCA 二分答案 差分

    2109. [NOIP 2015] 运输计划 ★★★☆   输入文件:transport.in   输出文件:transport.out   简单对比时间限制:3 s   内存限制:256 MB [题 ...

  7. [NOIP2012]借教室 题解

    题目大意: 有一个n个数的数列,m个操作,第i个操作使[li,ri]区间建di,问第几个操作使数列中出现负数. 思路: 暴力显然过不了,那么就可以优化了,不难想到线段树,显然需要良好的姿势,那么就差分 ...

  8. luoguP2680 运输计划 题解(二分答案+树上差分)

    P2680 运输计划  题目 这道题如果是看的我的树上差分来的,那么肯定一看题目就可以想到树上差分. 至于这是怎么想到的,一步一步来: 1.n有300000,不可能暴力枚举每一条边 2.因为我们要使运 ...

  9. NOIp2012:借教室

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

随机推荐

  1. JQuery从入门到精通

    1.JQuery查找元素 例:将表格的单元格中件数和重量差异不为0的数据标红 代码如下: <style> .notice{ color: red; } .right{ color: gre ...

  2. js 消息框

    消息框有三種:警告框.提示框.確認框 警告框: 確保用戶可以得到某些信息. 點擊確定以後,才能繼續後續操作. alert("不好") 確認框: 請用戶確認或者接受某些信息. 點擊確 ...

  3. python之tkinter使用举例-Button

    tkinter用于编写GUI界面,python3默认已经包含,直接使用. # GUI:tkinter使用举例 import tkinter # 实例化tkinter对象 top = tkinter.T ...

  4. Baltic Dry Index

    波罗的海干散货指数(Baltic Dry Index,缩写BDI),是航运业的经济指标,它包含了航运业的干散货交易量的转变. BDI波罗的海指数是由几条主要航线的即期运费(Spot Rate)加权计算 ...

  5. ceph API之PHP的S3-SDK包的泛域名解析问题

    安装dns工具包yum -y install bind-utils 安装dns软件 yum install -y dnsmasq 配置dnsmasq的配置文件:/etc/dnsmasq.conf li ...

  6. emwin之LISTWHEEL控件之LISTWHEEL_SetPos函数的使用

    @2018-09-05 [小记] LISTWHEEL控件的LISTWHEEL_SetPos函数的使用注意事项: 该函数不能在创建窗口的WM_INIT_DIALOG分支下作为修改LISTWHEEL控件属 ...

  7. Django-Ajax及跨域请求

    Ajax准备知识:json 什么是json? 定义: JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式.它基于 ECMAScript (w ...

  8. 关于移动端及flex

    我们知道写pc页面的时候,ui设计图是多少px,我们写网页的时候,就会写多少px,这个其实就是由pc端屏幕的物理像素,和我们设计图的css逻辑像素决定的,由于屏幕的物理像素和css逻辑像素比,刚好是1 ...

  9. opencv 霍夫变换 实现图片旋转角度计算

    在OCR实际开发中,证件照采集角度有很大的偏差,需要将图片进行旋转校正, 效果图: 在应用中发现应该加入高斯模糊,可以极大减少误差线条. 知道线条后 通过求斜率 得旋转角度 .(x1-x2)/(y1- ...

  10. 项目管理工具Maven的安装

    首先下载maven http://maven.apache.org/download.cgi 然后解压到不含中文和空格的目录,我直接解压到了D盘 然后添加环境变量: MAVEN_HOME:D:\apa ...