站外题求助
  • 板块学术版
  • 楼主Svemit
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/2/18 09:01
  • 上次更新2023/10/24 00:31:32
查看原帖
站外题求助
503792
Svemit楼主2023/2/18 09:01

link

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long long ull;
const int N = 5e4 + 5, INF = 0x3f3f3f3f;
const ll mod = 1e9 + 7;

int n;
int a[N];
int pos[N], block[N], st[N], ed[N], tag[N];

void change(int l, int r, int c)
{
	if(pos[l] == pos[r])
	{
		for(int i = l;i <= r;i ++)
			a[i] += c;
		for(int i = st[pos[l]];i <= ed[pos[l]];i ++)
			block[i] = a[i];
		sort(block + st[pos[l]], block + ed[pos[l]] + 1);
	}
	else
	{
		for(int i = l;i <= ed[pos[l]];i ++)
			a[i] += c;
		for(int i = st[pos[l]];i <= ed[pos[l]];i ++)
			block[i] = a[i];
		sort(block + st[pos[l]], block + ed[pos[l]] + 1);
		for(int i = pos[l] + 1;i <= pos[r] - 1;i ++)
			tag[i] += c;
		for(int i = st[pos[r]];i <= r;i ++)
			a[i] += c;
		for(int i = st[pos[r]];i <= ed[pos[r]];i ++)
			block[i] = a[i];
		sort(block + st[pos[r]], block + ed[pos[r]] + 1);
	}
}

int query(int l, int r, int c)
{
	c *= c;
	int res = 0;
	if(pos[l] == pos[r])
	{
		for(int i = l;i <= r;i ++)
			if(a[i] + tag[pos[i]] <= c) res ++;
	}
	else
	{
		for(int i = l;i <= ed[pos[l]];i ++)
			if(a[i] + tag[pos[l]] <= c) res ++;
		for(int i = pos[l] + 1;i <= pos[r] - 1;i ++)
			res += upper_bound(block + st[i], block + ed[i] + 1, c - tag[i]) - block - st[i];
		for(int i = st[pos[r]];i <= r;i ++)
			if(a[i] + tag[pos[r]] <= c) res ++;
	}
	return res;
}

int main()              //主函数
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cin >> n;
	for(int i = 1;i <= n;i ++)
	 	cin >> a[i];
	int len = sqrt(n);
	int num = n / len;
	if(n % num) num ++;
	for(int i = 1;i <= num;i ++)
		st[i] = ed[i - 1] + 1, ed[i] = (i - 1) / len + 1;
	ed[num] = n;
	for(int i = 1;i <= num;i ++)
	{
		for(int j = st[i];j <= ed[i];j ++)
		{
			pos[j] = i;
			block[j] = a[j];
		}
		sort(block + st[i], block + ed[i] + 1);
	}
	for(int i = 1;i <= n;i ++)
	{
		int op, l, r, c;
		cin >> op >> l >> r >> c;
		if(op == 0) change(l, r, c);
		else cout << query(l, r, c) << '\n';
	}
    return 0;
}
2023/2/18 09:01
加载中...