分块TLE40分求助
查看原帖
分块TLE40分求助
342868
qfpjm楼主2022/1/18 09:19
#include <bits/stdc++.h>

using namespace std;

int n, sq, a[500005], st[500005], ed[500005], block[500005], sum[500005], maxa[500005];

void change(int l, int r)
{
	int lb = block[l], rb = block[r];
	if (lb == rb)
	{
		for (int i = l ; i <= r ; i ++)
		{
			if (a[i] == maxa[lb])
			{
				maxa[lb] = sqrt(a[i]);
			}
			sum[lb] -= a[i];
			sum[lb] += sqrt(a[i]);
			a[i] = sqrt(a[i]);
		}
		for (int i = st[lb] ; i <= ed[lb] ; i ++)
		{
			maxa[lb] = max(maxa[lb], a[i]);
		}
		return ;
	}
	if (maxa[lb] > 1)
	{
		for (int i = l ; i <= ed[lb] ; i ++)
		{
			if (a[i] == maxa[lb])
			{
				maxa[lb] = sqrt(a[i]);
			}
			sum[lb] -= a[i];
			sum[lb] += sqrt(a[i]);
			a[i] = sqrt(a[i]);
		}
		for (int i = st[lb] ; i <= ed[lb] ; i ++)
		{
			maxa[lb] = max(maxa[lb], a[i]);
		}
	}
	if (maxa[rb] > 1)
	{
		for (int i = st[rb] ; i <= r ; i ++)
		{
			if (a[i] == maxa[rb])
			{
				maxa[rb] = sqrt(a[i]);
			}
			sum[rb] -= a[i];
			sum[rb] += sqrt(a[i]);
			a[i] = sqrt(a[i]);
		}
		for (int i = st[rb] ; i <= ed[rb] ; i ++)
		{
			maxa[rb] = max(maxa[rb], a[i]);
		}
	}
	for (int i = lb + 1 ; i <= rb - 1 ; i ++)
	{
		if (maxa[i] > 1)
		{
			for (int j = st[i] ; j <= ed[i] ; j ++)
			{
				if (a[j] == maxa[i])
				{
					maxa[i] = a[j];
				}
				sum[i] -= a[j];
				sum[i] += sqrt(a[j]);
				a[j] = sqrt(a[j]);
			}
			for (int j = st[i] ; j <= ed[i] ; j ++)
			{
				maxa[i] = max(maxa[i], a[j]);
			}
		}
	}
}

int cnt(int l, int r)
{
	int lb = block[l], rb = block[r], ans = 0;
	if (lb == rb)
	{
		for (int i = l ; i <= r ; i ++)
		{
			ans += a[i];
		}
		return ans;
	}
	for (int i = l ; i <= ed[lb] ; i ++)
	{
		ans += a[i];
	}
	for (int i = st[rb] ; i <= r ; i ++)
	{
		ans += a[i];
	}
	for (int i = lb + 1 ; i <= rb - 1 ; i ++)
	{
		ans += sum[i];
	}
	return ans;
}

int main()
{
	cin >> n;
	sq = sqrt(n);
	for (int i = 1 ; i <= n ; i ++)
	{
		scanf("%d", &a[i]);
		int s = i / sq + 1;
		if (!st[s])
		{
			st[s] = i;
		}
		ed[s] = i;
		sum[s] += a[i];
		maxa[s] = max(maxa[s], a[i]);
		block[i] = s;
	}
	int q;
	cin >> q;
	for (int i = 1 ; i <= q ; i ++)
	{
		int opt, l, r;
		scanf("%d%d%d", &opt, &l, &r);
		if (l > r)
		{
			swap(l, r);
		}
		if (!opt)
		{
			change(l ,r);
		}
		else
		{
			printf("%d\n", cnt(l, r));
		}
	}
}
2022/1/18 09:19
加载中...