虽过不懂,悬关
  • 板块P4939 Agent2
  • 楼主2023gdgz01
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/6/8 15:06
  • 上次更新2024/6/8 15:23:18
查看原帖
虽过不懂,悬关
891606
2023gdgz01楼主2024/6/8 15:06

Rt,打了一个普普通通的分块,时间复杂度是 O(Mn)O(M\sqrt n) 的,带入极限数据约为 1.2×1091.2\times10^9,按理来说铁定会超时,但是直接过了。。。所以是数据水了吗?贴一下代码(问完就删):

#include <cstdio>
#include <cmath>

template <typename T, const int _size> class block
{
	protected:
		int len, id[_size + 5];
		T sum[_size + 5], data[_size + 5], flag[_size + 5];
	public:
		block() {}
		~block() {}
		inline void build(int n)
		{
			len = sqrt(n);
			for (register int i = 1; i <= n; ++i)
			{
				id[i] = (i - 1) / len + 1;
			}
		}
		inline void modify(int L, int R, T v)
		{
			int l = id[L], r = id[R];
			for (register int i = L; id[i] == l && i <= R; ++i)
			{
				data[i] += v;
				sum[l] += v;
			}
			if (l == r)
			{
				return;
			}
			for (register int i = l + 1; i < r; ++i)
			{
				flag[i] += v;
				sum[i] += len * v;
			}
			for (register int i = R; id[i] == r; --i)
			{
				data[i] += v;
				sum[r] += v;
			}
		}
		inline T query(int pos)
		{
			return data[pos] + flag[id[pos]];
		}
};

int n, m, x, y, opt;
block<int, 10000000> b;

int main()
{
	scanf("%d%d", &n, &m);
	b.build(n);
	while (m--)
	{
		scanf("%d%d", &opt, &x);
		if (opt == 0)
		{
			scanf("%d", &y);
			b.modify(x, y, 1);
		}
		else
		{
			printf("%d\n", b.query(x));
		}
	}
	return 0;
}
2024/6/8 15:06
加载中...