题解 P1083 【借教室】

hicc0305

2018-07-06 18:29:31

Personal

由于只用输出第一个不满足条件的编号,所以可以二分这个人的编号。 对于每一个二分出来的编号,进行检验,看在这个人之前的操作是否符合要求 处理区间操作时,可以用差分进行维护 ```cpp #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n,m; int a[1000100],c[1000100],tmp[1000100]; int d[1000100],s[1000100],t[1000100]; bool check(int k) { memcpy(c,tmp,sizeof(c)); for(int i=1;i<=k;i++) c[s[i]]-=d[i],c[t[i]+1]+=d[i]; for(int i=1;i<=n;i++) { a[i]=a[i-1]+c[i]; if(a[i]<0) return 0; } return 1; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]),c[i]=a[i]-a[i-1]; memcpy(tmp,c,sizeof(tmp)); for(int i=1;i<=m;i++) scanf("%d%d%d",&d[i],&s[i],&t[i]); if(check(m)) { cout<<0; return 0; } int l=1,r=m; while(l<r) { int mid=(l+r)/2; if(check(mid)) l=mid+1; else r=mid; } cout<<-1<<endl<<l; return 0; } ```