P1083 借教室(差分前綴和&二分)

P1083 借教室(差分前綴和&二分)

傳送門

思路:差分前綴和+二分。對於區間的加減可以用通過差分數組實現,因爲要求最小不滿足條件的編號,因爲此情況具有單調性,所以可以二分答案。

時間複雜度:O(nlogn)O(nlogn)

AC代碼:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+5;
struct p{
	int d,l,r;
}a[N];
int n,m,b[N];
ll dif[N];
bool jg(int x){
	memset(dif,0,sizeof dif);
	for(int i=1;i<=x;i++)
		dif[a[i].l]+=a[i].d,dif[a[i].r+1]-=a[i].d;//差分數組 
	for(int i=1;i<=n;i++){
		dif[i]+=dif[i-1];//前綴和. 
		if(dif[i]>b[i]) return 0;
	}
	return 1;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) scanf("%d",&b[i]);
	for(int i=1;i<=m;i++) scanf("%d%d%d",&a[i].d,&a[i].l,&a[i].r); 
	if(jg(m)) return puts("0"),0;
	int l=1,r=m;
	while(l<r){
		int mid=(l+r)>>1;
		if(jg(mid)) l=mid+1;
		else r=mid;//因爲是最大出現的不滿足的所以r=mid,而不是r=mid-1(這樣是找滿足條件的最大的) 
	}
	printf("-1\n%d\n",r); 
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章