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 }
以上是关于Vijos P1782 借教室 ( 前缀和&&差分序列)的主要内容,如果未能解决你的问题,请参考以下文章
二分查找or线段树(借教室洛谷1083vijos1782NOIP 2012 提高组 第二天 第二题)