noip提高组2012 借教室(luogu 1083)

原题链接:https://www.luogu.org/problem/show?pid=1083

坐在我对面的dalao瞬间就写出了线段树的解法,蒟蒻线段树太弱,只能写前缀和。

大致分析了一下,二分答案每天能否能满足当天的需求,能就向后找,不能就向前找,

找到最后都能满足,那就是能满足了,不然,此时就会停留在第一个不能满足的时刻。

(终于会用插入代码的操作了(我太弱了。。。))

#include<cstdio>
#include<cstring>
using namespace std;
void read(int &y)
{
    y=0;char x=getchar();
    while(x<‘0‘||x>‘9‘) x=getchar();
    while(x>=‘0‘&&x<=‘9‘)
    {
        y=y*10+x-‘0‘;
        x=getchar();
    }
}
int n,m,d[1000005],s[1000005],t[1000005];
int sum[1000005],a[1000005];
int check(int x)
{
    memset(sum,0,sizeof(sum));
    for(int i=1;i<=x;i++)
    {
        sum[s[i]]-=d[i];
        sum[t[i]+1]+=d[i];
    }
    for(int i=1;i<=n;i++)
    {
        sum[i]+=sum[i-1];
        if(a[i]+sum[i]<0) return 0;
    }
    return 1;
}
int main()
{
    read(n);read(m);
    for(int i=1;i<=n;i++) read(a[i]);
    for(int i=1;i<=m;i++)
    {
        read(d[i]);
        read(s[i]);
        read(t[i]);
    }
    int l=1,r=m,mid;
    while(l<r)
    {
        mid=(l+r)>>1;
        if(check(mid)==0) r=mid;
        else l=mid+1;
    }
    if(r==m) printf("0");
    else printf("-1\n%d",r);
    return 0;
} 
时间: 2024-12-26 15:42:06

noip提高组2012 借教室(luogu 1083)的相关文章

【NOIP】提高组2012 借教室

[算法]线段树||二分+前缀和 [题解]二分前缀和写法:http://hzwer.com/2959.html #include<cstdio> #include<algorithm> using namespace std; const int maxn=1e6; struct treess{int l,r,ms,delta;}t[maxn*3]; int a[maxn],n,m; int read() { int x=0,f=1; char c=getchar(); while(

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

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

【2012noip提高组】借教室

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

noip提高组2013 积木大赛(luogu 1969)

原题链接:https://www.luogu.org/problem/show?pid=1969 将高度看成一个序列,当出现下降的时候,就将操作次数加上一个记录的层数,然后记录这时的高度,继续向下读入 不过需要注意加上最后的高度.防止最后是一个单调上升... 为什么这样是对的呢,因为这样操作是从右向左操作的,左边的高度已知,并且之前的已经处理好. #include<cstdio> int n,h[100015],t,ans; void read(int &y) { y=0;char x

Vijos P1002 过河 (NOIP提高组2005)

链接:https://www.vijos.org/p/1002 解析: 若 p*x+(p+1)*y=Q(采用跳跃距离p和p+1时可以跳至任何位置Q),则在Q ≥ P*(P-1)时是一定有解的. 由于题目给出的一个区间是1≤S≤T≤10,于是当相邻的两个石子之间的距离不小于8*9=72时,则后面的距离都可以到达,我们就可以认为它们之间的距离就是72.如此一来,我们就将原题L的范围缩小为了100*72=7200,动态规划算法完全可以承受了. 但是当S=T时,上述等式是无法使用的,在这种情况下,只需要

NOIP提高组2004 合并果子题解

NOIP提高组2004 合并果子题解 描述:在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了.多多在合并果子时总共消耗的体力等于每次合并所耗体力之和. 因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力.假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出

NOIP 提高组2013 火柴排队 (Vijos P1842)

描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度.现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为:∑ i=1 n (a i ?b i ) 2  ,其中 a i   表示第一列火柴中第 i 个火柴的高度,b i   表示第二列火柴中第 i 个火柴的高度. 每列火柴中相邻两根火柴的位置都可以交换,请你通过交换使得两列火柴之间的距离最小.请问得到这个最小的距离,最少需要交换多少次?如果这个数字太大,请输出这个最小交换次数对 99,999,997 取模

NOIP提高组 1999 &amp; 2000 题解合集

[序言]话说我在学神奇算法的时候,基础应该也要巩固,于是打算提前把NOIP提高组的刷完. 具体的题目描述和提交我就在VIJOS上完成. [1999.1] 描述 给定一个信封,最多只允许粘贴N张邮票,计算在给定M(N+M<=10)种邮票的情况下(假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大max ,使得1-max之间的每一个邮资值都能得到. 例如,N=3,M=2,如果面值分别为1分.4分,则在l分-6分之间的每一个邮资值都能得到(当然还有8分.9分和12分):如果面值分别为1分.3分

2017.11.25【NOIP提高组】模拟赛A组

2017.11.25[NOIP提高组]模拟赛A组 T1 3467. [NOIP2013模拟联考7]最长上升子序列(lis) T2 3468. [NOIP2013模拟联考7]OSU!(osu) T3 3472. [NOIP2013模拟联考8]匹配(match) T1 有转移方程f[i]=max{f[j]}+1,a[j]<a[i] 可以用线段树+离散化维护这个方程,因为涉及以往状态可以用主席树维护 打太丑爆空间了 Code 1 #include<cstdio> 2 #include<c