听说灌水区大佬多
  • 板块灌水区
  • 楼主syr1125
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/5/30 21:06
  • 上次更新2024/5/31 06:29:18
查看原帖
听说灌水区大佬多
561949
syr1125楼主2024/5/30 21:06

板块漂移轻喷

#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N = 1e5 + 5, sN = 1e3;
int n, T, a[N], sum[sN], mark[sN], id[N];

void dost(int i)
{
	int ti = sqrt(a[i]);
	sum[id[i]] -= (a[i] - ti);
	if (a[i] > 1 && ti <= 1) mark[id[i]] --;
	a[i] = ti;
} 

signed main()
{
	scanf("%lld", &n);
	for (int i = 1; i <= n; i ++)
	{
		scanf("%lld", &a[i]);
		id[i] = i / sqrt(n) + 1;
		sum[id[i]] += a[i];
		mark[id[i]] += (a[i] > 1);
	} 
	
	scanf("%lld", &T);
	while (T --)
	{
		int op, l, r;
		scanf("%lld %lld %lld", &op, &l, &r);
		if (l > r) swap(l, r);
		if (op == 0)
		{
			int sid = id[l], eid = id[r], cnt = l;
			for (int k = sid; k <= eid; k ++)
			{
				if (mark[k] == 0) continue;
				else
				{
					for (cnt; cnt <= r; cnt ++) dost(cnt);
				}
			}
		}
		else
		{
			int sid = id[l], eid = id[r], ans = 0, i = l;
			for (int i = l; i <= r; )
			{
				if (i + sqrt(n) - 1 < r)
				{
					ans += sum[id[i]];
					i += sqrt(n);
				}
				else
				{
					ans += a[i];
					i ++;
				}
			}
			cout << ans << "\n";
		}
	}
	return 0;
}

是P4514的代码,主页也有求助帖,看到的大佬可以到主页帮帮我【玄关】

2024/5/30 21:06
加载中...