P1083 借教室-二分答案-差分陣列第二彈
阿新 • • 發佈:2018-12-03
- https://www.luogu.org/problemnew/show/P1083
- 小結:差分陣列,一般並沒有裸的考查,但是差分陣列的思想啊,輔助啊,還是比較常用的
- 思路:二分答案,列舉最多多少訂單能夠合法。每次檢驗答案按照差分思想檢驗判斷當前訂單數是否超過原來的量
-
#include<bits/stdc++.h> using namespace std; #define maxn 1234567 #define ll long long ll n,v,sum[maxn],pre[maxn]; ll a[maxn],m,l,r,ans[maxn]; struct node { ll l,r,v; } id[maxn]; bool ok(int ss) { memset(a,0,sizeof(a)); memset(sum,0,sizeof(sum)); for(int i=1; i<=ss; i++) { a[id[i].l]+=id[i].v; a[id[i].r+1]-=id[i].v; } for(int i=1; i<=n; i++) { sum[i]=sum[i-1]+a[i]; if(sum[i]>pre[i])return 0; } return 1; } int main() { scanf("%lld%lld",&n,&m); for(int i=1; i<=n; i++) scanf("%lld",&pre[i]); for(int i=1; i<=m; i++) scanf("%lld%lld%lld",&id[i].v,&id[i].l,&id[i].r); if(ok(m)) { printf("0\n"); return 0; } l=1; while(l<m) { ll mid=(l+m)/2; if(ok(mid)) l=mid+1; else m=mid; } printf("-1\n%lld\n",l); return 0; }