题目链接http://www.wikioi.com/problem/1217/

算法:二分答案(线段树可过wikioi数据)

  • 二分http://www.wikioi.com/solution/list/1217/   (我不多阐述)

    不难看出这道题满足二分条件 所以我们对数据进行二分

    维护一个具有前缀和性质的数组sum记录当前二分区间内的教室需求情况,那么第i天需要的教室数为∑sum(1→i)。

    维护方法:若订单i是从si天到ti天要借di个教室,那么sum[si]+=di,sum[ti+1]-=di。

    计算每天的需求量是否超出教室量,如果有,答案必定在该区间,继续二分该区间,否则答案应该在另一个区间,继续二分。

    (如果答案是0,一直二分下去肯定会有l = r的情况,然后就跳出来了=-=,此时m = l - 1)

    丧心病狂の加速:如果不是二分区间内的而且没读入的数据,你读它什么呢?233

    (这样写的好处有:①比线段树代码短②比线段树速度快 >_<)

    我的代码

    #include <cstdio>
    using namespace std; #define MID (l+r) >> 1 const int maxn = 1000000+10;
    int sum[maxn], cl[maxn], d[maxn], s[maxn], t[maxn], n, m, last, last_q; int check(int r) {
    int ret = 0;
    for(int i = 1; i <= n; ++i) { //这里必须要到n,因为是用前缀和, 即sum[t[i]]的t[i]后可能还有sum= =。。
    ret += sum[i];
    if(ret > cl[i]) return 0;
    }
    return 1;
    } int main() {
    scanf("%d%d", &n, &m);
    int l = 1, r = m, mid, i;
    for(i = 1; i <= n; ++i) scanf("%d", &cl[i]);
    while(l <= r) {
    mid = MID;
    if(last_q < mid){
    for(i = last+1; i <= mid; ++i) scanf("%d%d%d", &d[i], &s[i], &t[i]);
    last_q = mid;
    }
    //这里最容易错,要清楚标记
    for(i = mid+1; i <= last; ++i) sum[s[i]] -= d[i], sum[t[i]+1] += d[i]; //将原来加上去的和减的恢复
    for(i = last+1; i <= mid; ++i) sum[s[i]] += d[i], sum[t[i]+1] -= d[i]; //加上去的和减去新添加的元素
    last = mid;
    if(check(mid)) l = mid+1;
    else r = mid-1;
    }
    //一般闭区间二分的答案是l-1,在这里,l-1=m时说明所有人都满足
    if(l-1 == m) printf("0");
    else printf("-1\n%d", l); //而因为l-1是答案,所以l-1+1=l就是下一个不符合答案的
    return 0;
    }
  • 线段树(区间更新和维护最小)

    注意:用线段树最容易错的地方就是认为当修改后全部教室加起来的和为负的那个人就是解。其实应该是每天的教室需求量,不是和。所以不能维护区间和,要维护一个最小值,最小值为负,说明这个人就是答案

    #include <cstdio>
    using namespace std; #define lson l, m, rt << 1
    #define rson m+1, r, rt << 1 | 1
    #define MID (l+r)>>1
    #define lc rt << 1
    #define rc rt << 1 | 1 int min(const int& a, const int& b){return a < b ? a : b;} const int maxn = 1e6+10;
    int minx[maxn << 2], add[maxn << 2], n, m, L, R, _add; //向上传递最小的
    void pushup(int rt) {
    minx[rt] = min(minx[lc], minx[rc]);
    } //向下传递修改值
    void pushdown(int rt) {
    if(add[rt]) {
    add[lc] += add[rt];
    add[rc] += add[rt];
    minx[lc] += add[rt];
    minx[rc] += add[rt];
    add[rt] = 0;
    }
    } void build(int l, int r, int rt) {
    add[rt] = 0;
    if(l == r) {
    scanf("%d", &minx[rt]);
    return;
    }
    int m = MID;
    build(lson); build(rson);
    pushup(rt);
    } void update(int l, int r, int rt) {
    if(L <= l && r <= R) {
    add[rt] += _add;
    minx[rt] += _add; //这里直接修改即可
    return;
    }
    pushdown(rt);
    int m = MID;
    if(L <= m) update(lson);
    if(m < R) update(rson);
    pushup(rt);
    } int main() {
    scanf("%d%d", &n, &m);
    build(1, n, 1);
    int i;
    for(i = 1; i <= m; ++i) {
    scanf("%d%d%d", &_add, &L, &R);
    _add = -_add;
    update(1, n, 1);
    if(minx[1] < 0) { printf("-1\n%d", i); return 0;}
    }
    printf("0");
    return 0;
    }

【wikioi】1217 借教室的更多相关文章

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

    1217 借教室 2012年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 在大学期间,经常需要租借教 ...

  2. codevs 1217 借教室

    传送门 1217 借教室 2012年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Descripti ...

  3. 借教室(codevs 1217)

    1217 借教室 2012年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Descrip ...

  4. NOIP 2012 Day2T2 借教室题解

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

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

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

  6. [NOIP2012] 提高组 洛谷P1083 借教室

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

  7. NOIp 2012 #2 借教室 Label:区间修改线段树

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

  8. 【NOIP2012】借教室

    因为本校OJ+1s所以用线段树水过了,不去syz的水库水这题还真不知道线段树过不了= = 原题: 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要 向学校申请借教室.教室的 ...

  9. NOIP 2012 T5 借教室 [洛谷P1083]

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

随机推荐

  1. Linux 命令行生成随机密码的十种方法

    Linux操作系统的一大优点是对于同样一件事情,你可以使用高达数百种方法来实现它.例如,你可以通过数十种方法来生成随机密码.本文将介绍生成随机密码的十种方法.这些方法均收集于Command-Line ...

  2. GAE初探-一鼻子灰

    考虑到GAE可以一定条件下免费发布app,再加上之前有潜在客户需要用到GAE. 遂决定了解一番. 以比较熟悉的django作为切入点, 1. 首先安装 GAE-launcher,似乎没有太大问题 2. ...

  3. Python DBUtils

    1 简介 DBUtils是一套Python数据库连接池包,并允许对非线程安全的数据库接口进行线程安全包装.DBUtils来自Webware for Python. DBUtils提供两种外部接口: P ...

  4. 【转】maven仓库快速镜像

    本文转自:http://blog.csdn.net/zuoluoboy/article/details/20007819 国内连接maven官方的仓库更新依赖库,网速一般很慢,收集一些国内快速的mav ...

  5. 如何破解excel宏的密码

    http://zhidao.baidu.com/question/140107193.html 最近下载了一个excel模板,使用excel宏编的,但实际需要需更改一下,但是他设置了工作表密码保护,谁 ...

  6. UVALive 7040 Color (容斥原理+逆元+组合数+费马小定理+快速幂)

    题目:传送门. 题意:t组数据,每组给定n,m,k.有n个格子,m种颜色,要求把每个格子涂上颜色且正好适用k种颜色且相邻的格子颜色不同,求一共有多少种方案,结果对1e9+7取余. 题解: 首先可以将m ...

  7. WebSocket技术

    webSocket技术 在html5技术革新中,加入了WebSocket技术 1.webSocket实际是TCP连接 webSocket在最初将发送http连接请求到服务器端, 但是在header中加 ...

  8. FreeMarker备忘

    以下内容全部是网上收集: FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个部分组成: ,文本:直接输出的部分 ,注释:<#-- ... --& ...

  9. 水果姐逛水果街Ⅰ(codevs 3304)

    题目描述 Description 水果姐今天心情不错,来到了水果街. 水果街有n家水果店,呈直线结构,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样. 学过oi的水果姐迅速发现了 ...

  10. redis的单实例配置+web链接redis

    [root@cache01 src]# wget http://download.redis.io/redis-stable.tar.gz [root@cache01 src]# tar -xzvf ...