求大佬帮忙看看分块
  • 板块学术版
  • 楼主Boring__Zheng
  • 当前回复2
  • 已保存回复2
  • 发布时间2021/6/5 21:47
  • 上次更新2023/11/4 22:16:17
查看原帖
求大佬帮忙看看分块
186573
Boring__Zheng楼主2021/6/5 21:47

分块入门 全WA 要裂开了

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

const int N = 50005;
int fir[N], las[N];
long long a[N], add[N];

inline int read()
{
	int x = 0, f = 1; char ch = getchar();
	while (ch < '0' or ch > '9') f *= ch == '-' ? -1 : 1, ch = getchar();
	while (ch >= '0' and ch <= '9') x = x * 10 + ch - '0', ch = getchar();
	return x * f;
}

int main()
{
	int n = read();
	int cnt = ((int)sqrt(n)*(int)sqrt(n)==n) ? (int)sqrt(n) : ((int)sqrt(n)+1);
	int k = (int)sqrt(n);
	for (int i = 1;i <= n;i++) a[i] = (long long)read(), add[i] = 0;
	fir[0] = 1 - k; las[0] = 0;
	for (int i = 1;i <= cnt;i++) fir[i] = fir[i - 1] + k, las[i] = las[i - 1] + k;
	las[cnt] = n;
	while (n--)
	{
		int opt = read(), l = read(), r = read(), c = read();
		if (opt)
		{
			int pos = (r - 1) / k + 1;
			printf("%lld\n", a[r] + add[pos]);
		}
		else
		{
			int firpos = (l - 1) / k + 1, laspos = (r - 1) / k + 1;
			for (int i = l;i <= las[firpos];i++) a[i] += (long long)c;
			if (firpos != laspos) for (int i = fir[laspos];i <= r;i++) a[i] += (long long)c;
			for (int i = firpos + 1;i < laspos;i++) add[i] += (long long)c;
		}
	}
	return 0;
}
2021/6/5 21:47
加载中...