分块80分第5个点TLE求调
查看原帖
分块80分第5个点TLE求调
538857
myyyIisq2R楼主2023/7/24 11:49
#include <bits/stdc++.h>
#define int long long
using namespace std;

int n,m;
int a[5000001];
int tag[5000001],L[50001],R[50001],sum[50001],lz[50001];

inline void Change(int l,int r,int k)
{
	if(tag[l] == tag[r])
	{
		for(int i = l; i <= r; i ++)
		{
			a[i] += k;
			sum[tag[i]] += k;
		}
		return;
	}
	for(int i = l; i <= R[tag[l]]; i ++)
	{
		a[i] += k;
		sum[tag[i]] += k;
	}
	for(int i = tag[l] + 1; i < tag[r]; i ++)
	{
		lz[i] += k;
		sum[i] += (R[i] - L[i] + 1) * k;
	}

	for(int i = L[tag[r]]; i <= r; i ++)
	{
		a[i] += k;
		sum[tag[i]] += k;
	}

}


signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	int len = sqrt(n);
	for(int i = 1; i <= n; i ++)
		tag[i] = (i - 1) / len + 1;
	for(int i = 1; i <= tag[n]; i ++)
	{
		L[i] = R[i - 1] + 1;
		R[i] = min(n,L[i] + len - 1);
	}

	for(int i = 1; i <= n; i ++) cin>>a[i];
	for(int i = 1; i <= tag[n]; i ++)
		for(int j = L[i]; j <= R[i]; j ++)
			sum[i] += a[j];
	for(int i = 1; i <= m; i ++)
	{
		int l,r,k;
		cin>>l>>r>>k;
		Change(l,r,k);
	}
	int minn = INT_MAX;
	for(int i {1}; i<=n; i++)
		minn = min(a[i] + lz[tag[i]],minn);
	cout<<minn;
	return 0;
}
2023/7/24 11:49
加载中...