萌新分块求助
查看原帖
萌新分块求助
173077
William_Wang_楼主2023/3/5 10:25
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN = 3e5 + 5;
int n, m, u, len, cnt, a[MAXN], b[MAXN], L[MAXN], R[MAXN], belong[MAXN];
signed main()
{
	cin >> n >> m >> u;
	len = sqrt(n);
	
	for(int i=1; i<=n; i++) cin >> a[i], b[i] = a[i];
	
	for(int i=1; i<=n; i++) 
	{
		belong[i] = ceil((1.0*i)/(1.0*len));
		if(L[belong[i]] == 0) L[belong[i]] = i;
		R[belong[i]] = max(R[belong[i]], i);
	}
	
	cnt = ceil((1.0*n) / (1.0*len));
	for(int i=1; i<=cnt; i++) sort(a+L[i], a+R[i]+1); 
	
	while(m--)
	{
		int l, r, v, p;
		cin >> l >> r >> v >> p;
		int k = 0, bl = belong[l], br = belong[r];
		if(bl == br)
		{
			for(int i=l; i<=r; i++) if(a[i] < v) k++;
			b[p] = (u*k) / (r-l+1);
			for(int i=L[belong[p]]; i<=R[belong[p]]; i++) a[i] = b[i];
			sort(a+L[belong[p]], a+R[belong[p]]+1); 
		}
		else
		{
			for(int i=l; belong[i]==bl; i++) if(a[i] < v) k++;
			for(int i=r; belong[i]==br; i--) if(a[i] < v) k++;
			for(int i=bl+1; i<br; i++)
			{
				int t = lower_bound(a+L[i], a+R[i]+1, v) - a;
				t = t - L[i];
				if(t > 0) k += t;
			}
			b[p] = (u*k) / (r-l+1);
			for(int i=L[belong[p]]; i<=R[belong[p]]; i++) a[i] = b[i];
			sort(a+L[belong[p]], a+R[belong[p]]+1); 
		}
	}
	for(int i=1; i<=n; i++) cout << b[i] << "\n";
	return 0;
}
2023/3/5 10:25
加载中...