简单分块求优化
查看原帖
简单分块求优化
1041101
Aventurine_stone楼主2024/1/24 14:37
#include<bits/stdc++.h>
using namespace std;
inline int read()
{
	int x=0;
	char c=getchar();
	while(c<'0'||c>'9')
		c=getchar();
	while(c>='0'&&c<='9')
	{
		x=(x<<3)+(x<<1)+(c-'0');
		c=getchar();
	}
	return x;
}
inline void write(int x)
{
	if(x>9)
		write(x/10);
	putchar(x%10+'0');
}
const int N=100010;
int n,m;
int a[N];
int tl[320],tr[320],tmax[320],jian[320],td[N];
int q,idx;
void build(int l,int r)
{
	idx++;
	tl[idx]=l,tr[idx]=r;
	for(int i=l;i<=r;i++)
		tmax[idx]=max(tmax[idx],a[i]),td[i]=idx;
	if(r==n)
		return ;
	build(l+q,min(r+q,n));
}
int p,l,r,x,ans;
int main()
{
	n=read(),m=read();
	for(int i=1;i<=n;i++)
		a[i]=read();
	q=sqrt(n);
	build(1,q);
	while(m--)
	{
		p=read(),l=read(),r=read(),x=read();
		int st=td[l],ed=td[r];
		if(p==1)
		{
			if(ed-st<=1)
			{
				for(int i=l;i<=r;i++)
					if(a[i]>x)
						a[i]-=x;
				tmax[st]=0;
				for(int i=tl[st];i<=tr[st];i++)
					tmax[st]=max(tmax[st],a[i]);
				if(st!=ed)
				{
					tmax[ed]=0;
					for(int i=tl[ed];i<=tr[ed];i++)
						tmax[ed]=max(tmax[ed],a[i]);
				}
			}
			else
			{
				for(int i=l;i<=tr[st];i++)
					if(a[i]>x)
						a[i]-=x;
				tmax[st]=0;
				for(int i=tl[st];i<=tr[st];i++)
					tmax[st]=max(tmax[st],a[i]);
				for(int i=tl[ed];i<=r;i++)
					if(a[i]>x)
						a[i]-=x;
				tmax[ed]=0;
				for(int i=tl[ed];i<=tr[ed];i++)
					tmax[ed]=max(tmax[ed],a[i]);
				for(int i=st+1;i<=ed-1;i++)
					if(tmax[i]-jian[i]>x)
					{
						for(int j=tl[i];j<=tr[j];j++)
							if(a[j]>jian[i])
								a[j]-=jian[i];
						tmax[i]=0;
						for(int j=tl[i];j<=tr[i];j++)
							tmax[i]=max(tmax[i],a[j]);
						jian[i]=x;
					}
			}
		}
		else
		{
			ans=0;
			if(ed-st<=1)
			{
				if(jian[st])
				{
					for(int i=tl[st];i<=tr[st];i++)
						if(a[i]>jian[st])
							a[i]-=jian[st];
					tmax[st]=0;
					for(int i=tl[st];i<=tr[st];i++)
						tmax[st]=max(tmax[st],a[i]);
					jian[st]=0;
				}
				if(jian[ed])
				{
					for(int i=tl[ed];i<=tr[ed];i++)
						if(a[i]>jian[ed])
							a[i]-=jian[ed];
					tmax[ed]=0;
					for(int i=tl[ed];i<=tr[ed];i++)
						tmax[ed]=max(tmax[ed],a[i]);
					jian[ed]=0;
				}
				for(int i=l;i<=r;i++)
					if(a[i]==x)
						ans++;
			}
			else
			{
//				for(int i=1;i<=n;i++)
//					cout<<a[i]<<" ";cout<<endl;
//				for(int i=1;i<=idx;i++)
//					cout<<i<<":"<<tmax[i]<<","<<jian[i]<<"|";
//				cout<<endl;
				if(jian[st])
				{
					for(int i=tl[st];i<=tr[st];i++)
						if(a[i]>jian[st])
							a[i]-=jian[st];
					tmax[st]=0;
					for(int i=tl[st];i<=tr[st];i++)
						tmax[st]=max(tmax[st],a[i]);
					jian[st]=0;
				}
				if(jian[ed])
				{
					for(int i=tl[ed];i<=tr[ed];i++)
						if(a[i]>jian[ed])
							a[i]-=jian[ed];
					tmax[ed]=0;
					for(int i=tl[ed];i<=tr[ed];i++)
						tmax[ed]=max(tmax[ed],a[i]);
					jian[ed]=0;
				}
				for(int i=l;i<=tr[st];i++)
					if(a[i]==x)
						ans++;
				for(int i=tl[ed];i<=r;i++)
					if(a[i]==x)
						ans++;
				for(int i=st+1;i<ed;i++)
				{
					if(tmax[i]-jian[i]<x)
						continue;
					if(jian[i])
					{
						for(int j=tl[i];j<=tr[i];j++)
							if(a[j]>jian[i])
								a[j]-=jian[i];
						tmax[i]=0;
						for(int j=tl[i];j<=tr[i];j++)
							tmax[i]=max(tmax[i],a[j]);
						jian[i]=0;
					}
					for(int j=tl[i];j<=tr[i];j++)
						if(a[j]==x)
							ans++;
				}
			}
			write(ans);
			puts("");
		}
	}
	return 0;
}
2024/1/24 14:37
加载中...