萌新求助线段树
查看原帖
萌新求助线段树
342868
qfpjm楼主2022/7/29 09:26

莫名 TLE

#include <bits/stdc++.h>
#define int long long

using namespace std;

int n, m, sum[500005];

void build(int u, int l, int r)
{
	if (l == r)
	{
		cin >> sum[u];
		return ;
	}
	int mid = (l + r) >> 1;
	build(u << 1, l, mid);
	build(u << 1 | 1, mid + 1, r);
	sum[u] = sum[u << 1] + sum[u << 1 | 1];
}

void mdi(int u, int l, int r, int l2, int r2)
{
	if (sum[u] <= r - l + 1)
	{
		return ;
	}
	if (l == r)
	{
		sum[u] = sqrt(sum[u]);
		return ;
	}
	int mid = (l + r) >> 1;
	if (l2 <= mid)
	{
		mdi(u << 1, l, mid, l2, r2);
	}
	if (r2 > mid)
	{
		mdi(u << 1 | 1, mid + 1, r, l2, r2);
	}
	sum[u] = sum[u << 1] + sum[u << 1 | 1];
}

int qry(int u, int l, int r, int l2, int r2)
{
	if (l2 <= l && r <= r2)
	{
		return sum[u];
	}
	int mid = (l + r) >> 1;
	int ans = 0;
	if (l2 <= mid)
	{
		ans += qry(u << 1, l, mid, l2, r2);
	}
	if (r2 > mid)
	{
		ans += qry(u << 1 | 1, mid + 1, r, l2, r2);
	}
	return ans;
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr); cout.tie(nullptr);
	int cnt = 0;
	while (cin >> n)
	{
		cout << "Case #" << ++ cnt << ":\n";
		build(1, 1, n);
		cin >> m;
		while (m --)
		{
			int opt, x, y;
			cin >> opt >> x >> y;
			if (x > y)
			{
				swap(x, y);
			}
			if (opt == 0)
			{
				mdi(1, 1, n, x, y);
			}
			else
			{
				cout << qry(1, 1, n, x, y) << endl;
			}
		}
		cout << endl;
		memset(sum, 0, sizeof(sum));
	}
}
2022/7/29 09:26
加载中...