分块40分求调,剩下的全WA
查看原帖
分块40分求调,剩下的全WA
357237
Unknown__楼主2024/1/28 22:10
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#define int long long
using namespace std;
int L[20111],R[20111],pos[2011111],n,tot,len,s[2011111],blk[2011111],T,tag[201111];
int query(int l,int r,int x)
{
	int ans = 0,i,j;
	if(pos[l] == pos[r])
	{
		for(i = l;i <= r;i++)if(s[i] + tag[pos[l]] >= x)ans++;
		return ans;
	}
	for(i = l;i <= R[pos[l]];i++)if(s[i] + tag[pos[l]] >= x)ans++;
	for(i = L[pos[r]];i <= r;i++)if(s[i] + tag[pos[r]] >= x)ans++;
	for(i = pos[l] + 1;i < pos[r];i++)
	{
		int ll = L[i],rr = R[i] + 1;
		while(ll < rr)
		{
		//	cout<<ll<<' '<<rr<<endl;
			int mid = ll + rr >> 1;
			if(blk[mid] + tag[i] >= x)rr = mid;
			else ll = mid + 1;
		}
		ans += R[i] - ll + 1;
	}
	return ans;
}
void modify(int l,int r,int x)
{
	int i,j;
	if(pos[l] == pos[r])
	{
		for(i = l;i <= R[pos[l]];i++)
			s[i] += x;
		for(i = L[pos[l]];i <= R[pos[l]];i++)
			blk[i] = s[i];
		sort(blk + L[pos[l]],blk + R[pos[l]]);
		return;
	}
	for(i = l;i <= R[pos[l]];i++)
		s[i] += x;
	for(i = L[pos[l]];i <= R[pos[l]];i++)
		blk[i] = s[i];
	sort(blk + L[pos[l]],blk + R[pos[l]]);
	for(i = L[pos[r]];i <= r;i++)
		s[i] += x;
	for(i = L[pos[r]];i <= R[pos[r]];i++)
		blk[i] = s[i];
	sort(blk + L[pos[r]],blk + R[pos[r]]);
	for(i = pos[l] + 1;i < pos[r];i++)
		tag[i] += x;
}
signed main()
{
	cin>>n>>T;
	int i,j;
	len = sqrt(n);
	tot = len;
	if(n % len)tot++;
	for(i = 1;i <= n;i++)cin>>s[i],blk[i] = s[i];
	for(i = 0;i <= 20001;i++)L[i] = 1e9;
	for(i = 1;i <= n;i++)
	{
		pos[i] = (i - 1) / len + 1;
		L[pos[i]] = min(L[pos[i]],i);
		R[pos[i]] = max(R[pos[i]],i);
	}
	for(i = 1;i <= tot;i++)
		sort(blk + L[pos[i]],blk + R[pos[i]]);
	while(T--)
	{
		char op;cin>>op;
		if(op == 'A')
		{
			int l,r,x;cin>>l>>r>>x;
			cout<<query(l,r,x)<<endl;
		}
		else
		{
			int l,r,x;cin>>l>>r>>x;
			modify(l,r,x);
		}
	}
}
2024/1/28 22:10
加载中...