【洛谷P1083】借教室
这个题目我们可以二分最多能够满足多少订单,每一次计算每天所需教室的数量(利用差分的思想打个标记,求个前缀和),看是否能够将这些订单全部满足,这样最坏的时间复杂度是nlogm,属于可以接受的范围内
#include<iostream> #include<cstring> #include<cstdio> using namespace std; long long n,m,a[1000010],ne[1000010],ans,l,r; struct in { long long c,f,l; }ter[1000010]; bool check(int x) { memset(ne,0,sizeof(ne)); long long q=1000000007,h=-1000000007;//记录枚举的起点和终点,进行优化 for(int i=1;i<=x;i++) ne[ter[i].f]+=ter[i].c,ne[ter[i].l+1]-=ter[i].c,q=min(q,ter[i].f),h=max(h,ter[i].l); for(int i=1;i<=n;i++) { ne[i]+=ne[i-1]; if(ne[i]>a[i]) return 1; } return 0; } int main() { scanf("%lld%lld",&n,&m); for(int i=1;i<=n;i++) scanf("%lld",&a[i]); l=1,r=n+1; for(int i=1;i<=m;i++) scanf("%lld%lld%lld",&ter[i].c,&ter[i].f,&ter[i].l); while(l<=r)//二分最多能够满足多少订单 { int mid=l+r>>1; if(check(mid)) ans=mid,r=mid-1; else l=mid+1; } if(!ans)//l一直上升,说明全部满足 printf("0"); else printf("-1\n%lld",ans); fclose(stdin); fclose(stdout); return 0; }

浙公网安备 33010602011771号