二分加差分 一片红 感觉和题解写的代码差不多呀,求大佬看看!!
查看原帖
二分加差分 一片红 感觉和题解写的代码差不多呀,求大佬看看!!
1024853
sana_37楼主2023/8/2 15:00
#include<iostream>
#include<string.h>
using namespace std;
bool Cheak(long long* day, long long* dt, int* start, int* end, long long* arr,int mid,int N,int M)
{
	memset(dt, 0, sizeof(long long) * (N + 1));
	
	for (int i = 1; i <= mid; i++)
	{
		dt[start[i]] += day[i];
		dt[end[i] + 1] -= day[i];
	}
	if (day[1] < dt[1])return true;
	for (int i = 2; i <= N; i++)
	{
		dt[i] += dt[i - 1];
		if (dt[i] > day[i])return true;
	}
	return false;

}


int main()
{
	int N;//天数
	int M;//订单数量
	
	cin >> N >> M;

	long long* arr = new long long[N + 1];

	for (int i = 1; i <= N; i++)cin >> arr[i];

	long long* day = new long long[M + 1];
	int* start = new int[M + 1];
	int* end = new int[M + 1];
	long long* dt = new long long[N + 1];

	for (int i = 1; i <= M; i++)cin >> day[i] >> start[i] >> end[i];
	
	int l = 1;
	int r = M;
	int mid;
	
	while (l <=r)
	{
		mid = (r + l) / 2;
		if (Cheak(day, dt, start, end, arr, mid,N,M))//订单无法完成
		{
			r = mid-1;
			
		}
		else
		{
			l = mid + 1;
			
		}
	}
	if (M!=r)
	{
		cout << "-1" << endl;
		 cout <<r+1<< endl;
	}
	else cout << "0" << endl;
        

	return 0;
}
2023/8/2 15:00
加载中...