noip2012借教室

Description

Input

Output

Sample Input

4 3
2 5 4 3
2 1 3
3 2 4
4 2 4

Sample Output

-1
2

Data Constraint

Hint

第一份订单满足后,4天剩余教室分数分别为0,3,2,3. 第二份订单要求第二天到第四天每天提供三个教室,而第三天剩余的教室数为二,因此无法满足。分配停止通知第二个申请人修改订单。

10% -> 1<=n,m<=10

30% -> 1<=n,m<=1000

70% -> 1<=n,m<=100000

100% -> 1<=n,m<=1000000, 0<=ri,dj<=1000000000, 1<=sj<=tj<=n

这道题很明显可以用线段树。

然而区间修改有比它更快,更好写的离线方法,差分数组。

首先这道题需要二分答案,接着用差分数组写check函数。b[i]=a[i]-a[i-1];b[1]=a[1];b为差分数组

我们可以发现一个性质(此处不做证明)对与a[i]的[l,r]区间减少s

相当与在b[l]-s,b[r+1]+s;

check(x)时,先求出b,然后进行修改,在之后判断修改过后的b数组根据a[i]=b[i]+a[i-1]判断a[i]<0即可返回false

#include<cstdio>
const int N=1e6+5;
int x[N],y[N],z[N],l[N],r[N],sl[N],n,m;
bool f(int a)
{
    for(int i=1;i<=n;i++) y[i]=x[i]-x[i-1];
    for(int i=1;i<=a;i++) y[l[i]]-=sl[i],y[r[i]+1]+=sl[i];
    for(int i=1;i<=n;i++)
    {
        z[i]=z[i-1]+y[i];
        if(z[i]<0) return 0;
    }
    return 1;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%d",&x[i]);
    for(int i=1;i<=m;i++)
        scanf("%d%d%d",&sl[i],&l[i],&r[i]);
    int l=0,r=m+1;
    while(l<r-1)
    {
        int mid=(l+r)>>1;
        if(f(mid)) l=mid;
        else r=mid;
    }
    if(r==m+1) putchar(‘0‘);
    else printf("-1\n%d",r);
    return 0;
}
时间: 2024-10-12 14:42:10

noip2012借教室的相关文章

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

题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要 向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然希望编程解决这个问题. 我们需要处理接下来n天的借教室信息,其中第i天学校有ri个教室可供租借.共有m份 订单,每份订单用三个正整数描述,分别为dj,sj,tj,表示某租借者需要从第sj天到第tj天租 借教室(包括第sj天和第tj天),每天需要租借dj个教室. 我们假定,租借者对教室的大小.地点没

浅谈差分数组的应用(二)&amp;[NOIP2012]借教室题解

[NOIP2012提高&洛谷P1083]借教室 Description 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样.面对海量租借教室的信息,我们自然希望编程解决这个问题. 我们需要处理接下来n天的借教室信息,其中第i天学校有ri个教室可供租借.共有m份订单,每份订单用三个正整数描述,分别为dj,sj,tj,表示某租借者需要从第sj天到第tj天租借教室(包括第sj天和第tj天),每天需要

NOIP2012 借教室 Splay初探

终于把区间操作的Splay搞明白了…… Splay的大致框架是这样的: 1 template <class T> 2 struct SplayNode 3 { 4 typedef SplayNode<T> Node; 5 Node* lch; 6 Node* rch; 7 Node* parent; 8 T val; 9 10 SplayNode(const T& _val,Node* _parent): 11 lch(0),rch(0),parent(_parent),v

NOIP2012 借教室

自己YY出来的方法,时间复杂度为n*m,但实际上并没有这么多,codeVS上最慢的一组有300多ms. 对于每一个订单,在它的左端点加上需要的教室数量,在右端点加1的位置减去需要的教室数量.然后统计前缀和,如果有某个点的前缀和大于了当天教室的数量,那么就有的订单就有问题了,然后从订单编号从小到大统计在订单区间的教室数量,保存恰好不能满足的那个订单:对于之后不满足题意的前缀和,统计订单的最大编号不能超过之前保存的订单标号. #include<cstdio> #define MAXN 100000

[NOIP2012]借教室 题解

题目大意: 有一个n个数的数列,m个操作,第i个操作使[li,ri]区间建di,问第几个操作使数列中出现负数. 思路: 暴力显然过不了,那么就可以优化了,不难想到线段树,显然需要良好的姿势,那么就差分. a[i]表示第i天比第i-1天多了多少房间,于是a的前缀和即为该天的房间数量.而a的维护显然为a[li]+=di,a[ri+1]-=di. 因为求最前的操作,于是我们可以二分答案.但如此常数比较大,又有冗余,可以来个栈一样的东西节省时间. 但是有大神想到了O(n+m)的算法.假设m个指令都可满足

【差分序列】【NOIP2012】借教室

1266. [NOIP2012] 借教室 ★★☆ 输入文件:classrooms.in 输出文件:classrooms.out 简单对比 时间限制:1 s 内存限制:128 MB [题目描述] 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要 向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然希望编程解决这个问题. 我们需要处理接下来n天的借教室信息,其中第i天学校有ri个教室可供租借.共有m份 订单,每

【NOIP2012】借教室

在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要 向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然希望编程解决这个问题. 我们需要处理接下来n天的借教室信息,其中第i天学校有ri个教室可供租借.共有m份 订单,每份订单用三个正整数描述,分别为dj,sj,tj,表示某租借者需要从第sj天到第tj天租 借教室(包括第sj天和第tj天),每天需要租借dj个教室. 我们假定,租借者对教室的大小.地点没有要求.即

NOIp2012:借教室

题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然希望编程解决这个问题. 我们需要处理接下来n天的借教室信息,其中第i天学校有ri个教室可供租借.共有m份订单,每份订单用三个正整数描述,分别为dj,sj,tj,表示某租借者需要从第sj天到第tj天租借教室(包括第sj天和第tj天),每天需要租借dj个教室. 我们假定,租借者对教室的大小.地点没有要求

NOIP2012提高组 Day 2 Problem 2 借教室

原题 题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然希望编程解决这个问题. 我们需要处理接下来n天的借教室信息,其中第i天学校有ri个教室可供租借.共有m份订单,每份订单用三个正整数描述,分别为dj,sj,tj,表示某租借者需要从第sj天到第tj天租借教室(包括第sj天和第tj天),每天需要租借dj个教室. 我们假定,租借者对教室的大小.地点没