Vijos P1782 借教室 ( 前缀和&&差分序列)

Posted chendl111

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vijos P1782 借教室 ( 前缀和&&差分序列)相关的知识,希望对你有一定的参考价值。

题目链接:借教室

 

题意:给出n天得教室数目,m个借教室得单子,按顺序借教室,问哪个单子不满足并输出

 

分析:可以用线段树做,会T,常数比较大,选择用差分序列维护前缀和,二分答案即可

 

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 
 6 int ans,n,m,r[1001000],d[1001000],s[1001000],t[1001000],pre[1001000];
 7 //inline int read(){int x=0;char ch=getchar();while(!(ch>=\'0\'&&ch<=\'9\')) ch=getchar();while(ch>=\'0\'&&ch<=\'9\'){x=x*10+ch-\'0\';ch=getchar();};return x;}
 8 
 9 int check(int x)
10 {
11     int sum=0;
12     memset(pre,0,sizeof(pre));
13     for(int i=1;i<=x;i++) pre[s[i]]+=d[i],pre[t[i]+1]-=d[i];
14     for(int i=1;i<=n;i++)
15     {
16         sum+=pre[i];
17         if(sum>r[i]) return 0;
18     }    
19     return 1;
20 }
21 
22 int main()
23 {
24     scanf("%d %d",&n,&m);
25     ans=0;
26     for(int i=1;i<=n;++i) scanf("%d",r+i);
27     for(int i=1;i<=m;++i) {scanf("%d %d %d",d+i,s+i,t+i);}
28     int l=1,r=m;
29     while(l<r)
30     {
31         int mid=(l+r)>>1;
32         if(check(mid)==0) ans=mid,r=mid;
33         else l=mid+1;
34     }
35     if(ans) printf("-1\\n%d\\n",ans);
36     else puts("0"); 
37 }
View Code

 

以上是关于Vijos P1782 借教室 ( 前缀和&&差分序列)的主要内容,如果未能解决你的问题,请参考以下文章

二分查找or线段树(借教室洛谷1083vijos1782NOIP 2012 提高组 第二天 第二题)

[前缀和+二分]借教室

借教室 Vijos 1782 Lazy NOIP2012 D2T2 线段树

luogu P1083 借教室

NOIP提高组2012 借教室

洛谷P1083 借教室 二分 + 差分