5分,线段树求调
查看原帖
5分,线段树求调
748239
OIbishop楼主2022/10/13 17:05
#include <bits/stdc++.h>
#define ls o<<1
#define rs o<<1|1
using namespace std;

int n , f[2000005] , a[500001] , v[2000005] , m;

inline void push_up (int o)
{
	f[o] = f[ls] + f[rs];
}

void build_tree (int o , int l , int r)
{
	if (l == r)
	{
		f[o] = a[l];
		return;
	}
	int mid = (l + r) >> 1;
	build_tree (ls , l , mid);
	build_tree (rs , mid + 1 , r);
	push_up (o);
} 

void push_down (int o , int l , int r)
{
	if (l == r) 
	{
		v[o] = 0;
		return;
	}
	int mid = (l + r) >> 1;
	f[ls] += (mid - l + 1) * v[o];
	f[rs] += (r - mid) * v[o];
	v[ls] += v[o];
	v[rs] += v[o];
	v[o] = 0;
	push_up (o);
}
void add (int o , int l , int r , int s , int t , int p)
{
	if (l == s && r == t)
	{
		f[o] += (t - s + 1) * p;
		v[o] += p;
		return ;
	}
	int mid = (l + r) >> 1;
	if (mid >= t)
		add (ls , l , mid , s , t , p);
	else if (mid < s)
		add (rs , mid + 1 , r , s , t , p);
	else 
		add (ls , l , mid , s , mid , p) , add (rs , mid + 1 , r , mid + 1 , t , p);
	push_up (o);
}

int find (int o , int l , int r , int x)
{
	if (v[o])
	{
		push_down (o , l , r);
	}
	if (l == r)
	{
		return f[o];
	}
	int mid = (l + r) >> 1;
	if (x == mid)
		return f[mid];
	else if (x > mid)
		return find (ls , l , mid , x);
	else 
		return find (rs , mid + 1 , r , x);
}

signed main (void)
{
	ios::sync_with_stdio (false);
	cin >> n >> m;
	for (int i = 1; i <= n; i++) 
	    cin >> a[i];
	build_tree (1 , 1 , n);
	for (int i = 1; i <= m; i++)
	{
		int d , s , t;
		cin >> d >> s >> t;
		add (1 , 1 , n , s , t , -d);
		if (find (1 , 1 , n , 1) < 0) 
		{
			cout << -1 << "\n" << i;
			return 0;
		}
	}
	cout << 0;
	return 0;
}
2022/10/13 17:05
加载中...