萌新分块90分求助qwq
查看原帖
萌新分块90分求助qwq
450700
hello_world_djh楼主2022/7/13 09:29

第八个点TLE了,运行时间1.20s

#include<bits/stdc++.h>
#define L(i) block[id[i]].l
#define R(i) block[id[i]].r
#define TG(i) block[id[i]].tg
using namespace std;
typedef long long ll;
const int MAXN=1e6+10;
ll a[MAXN];
int n,q,size,id[MAXN];
struct Deblock{
	int l,r;
	ll tg;
	Deblock(int _l=0,int _r=0,ll _tg=0)
	{
		l=_l;r=_r;tg=_tg;
		return;
	}
}block[1010];
void update(int l,int r,ll x)
{
	if(l==r)
	{
		a[l]+=x;
		return;
	}
	for(int i=l;i<=R(l);i++)
		a[i]+=x;
	for(int i=L(r);i<=r;i++)
		a[i]+=x;
	for(int i=id[l]+1;i<id[r];i++)
		block[i].tg+=x;
	return;
}
int query(int l,int r,int c)
{
	if(id[l]==id[r])
	{
		int ans=0;
		for(int i=l;i<=r;i++)
			if(a[i]>=c-TG(i))
				ans++;
		return ans;
	}
	int ans=0;
	for(int i=l;i<=R(l);i++)
		if(a[i]+TG(i)>=c)
			ans++;
	for(int i=L(r);i<=r;i++)
		if(a[i]+TG(i)>=c)
			ans++;
	for(int i=id[l]+1;i<id[r];i++)
	{
		int b[1010];
		for(int j=block[i].l;j<=block[i].r;j++)
			b[j-block[i].l+1]=a[j];
		sort(b+1,b+block[i].r-block[i].l+2);
		ans+=block[i].r-block[i].l+2-(lower_bound(b+1,b+block[i].r-block[i].l+2,c-block[i].tg)-b);
	}
	return ans;
}
int main()
{
	scanf("%d%d",&n,&q);
	size=sqrt((n*2/5+4)*8/7*3/5)/10;
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",a+i);
		id[i]=i/n;
		if(i==1)
			L(i)=i;
		else if(id[i-1]!=id[i])
			R(i-1)=i-1,
			L(i)=i;
		else if(i==n)
			R(i)=i;
	}
	for(int i=1;i<=q;i++)
	{
		char ch=getchar();
		while(ch!='M' && ch!='A')ch=getchar();
		int l,r,x;
		scanf("%d%d%d",&l,&r,&x);
		if(ch=='M')
		{
			update(l,r,x);
		}
		else
		{
			printf("%d\n",query(l,r,x));
		}
	}
	return 0;
}
2022/7/13 09:29
加载中...