●洛谷P1083 借教室
阿新 • • 發佈:2018-03-10
bre targe 區間 ron else 端點 n) get log
題鏈:
https://www.luogu.org/problemnew/show/P1083
題解:
二分,差分
顯然具有二分性:
如果只考慮1~p個人,就會在某一天無法滿足,
那麽顯然只考慮1~[p+1,M]個人都會無法滿足。
所以二分答案mid,第1~mid個人是否導致了無法滿足,
然後對於每個人,現在其對應的區間的左右端點打上差分標記,
然後O(n)掃一遍,看看是否在某一天會無法滿足。
並以此來縮小l或r的範圍。
代碼:
#include<bits/stdc++.h> #define MAXN 1000006 using namespace std; struct Query{ int d,l,r; }A[MAXN]; int N,M; int R[MAXN],C[MAXN]; bool wrong(int p){ static int sum,fg; sum=0; fg=0; for(int i=1;i<=p;i++) C[A[i].l]+=A[i].d,C[A[i].r+1]-=A[i].d; for(int i=1;sum+=C[i],i<=N;i++) if(sum>R[i]){fg=1; break;} for(int i=1;i<=p;i++) C[A[i].l]-=A[i].d,C[A[i].r+1]+=A[i].d; return fg; } int binary(){ int l=1,r=M,mid,ret=0; while(l<=r){ mid=(l+r)>>1; if(wrong(mid)) ret=mid,r=mid-1; else l=mid+1; } return ret; } int main(){ scanf("%d%d",&N,&M); for(int i=1;i<=N;i++) scanf("%d",&R[i]); for(int i=1;i<=M;i++) scanf("%d%d%d",&A[i].d,&A[i].l,&A[i].r); int ans=binary(); if(!ans) printf("%d\n",ans); else printf("%d\n%d\n",-1,ans); return 0; }
●洛谷P1083 借教室