MnZn 求助 loj 入门分块2
  • 板块题目总版
  • 楼主fjy666
  • 当前回复2
  • 已保存回复2
  • 发布时间2021/3/31 14:26
  • 上次更新2023/11/5 01:20:09
查看原帖
MnZn 求助 loj 入门分块2
366338
fjy666楼主2021/3/31 14:26

RTRT,以下代码开任何优化(-O1,O2,O3,Ofast)都能AC,但不开就是不行。
有谁能提供一下没有优化就 AC 的代码吗? /kk

#include <cstdio>
#include <algorithm>
#include <cctype>
#define fo(i_,j_,k_) for(int i_=j_;i_<=k_;++i_)
#define fr(i_,j_,k_) for(int i_=j_;i_>=k_;--i_)
#define rg register
#define rtn return
#define il inline

using namespace std;
typedef long long ll;
const int kMaxn = 50050,len = 305;
int id[kMaxn],a[kMaxn],b[kMaxn],n; 
int blo[205][len+5],ptr[205];

#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<8,stdin),p1==p2)?EOF:*p1++)
char buf[1<<8],*p1=buf,*p2=buf;
inline int read(void)
{
    char c=getchar();int x=0;bool f=0;
    for(;!isdigit(c);c=getchar())f^=!(c^45);
    for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+(c^48);
    if(f)x=-x;
	rtn x;
}

il void Initalize(void)
{
	fo(i,1,n)
	{
		id[i] = (i-1) / len + 1;
		blo[id[i]][ptr[id[i]]++] = a[i];
	}
	fo(i,1,id[n])sort(blo[i],blo[i]+ptr[i]);
}

il void Resort(int id)
{
	ptr[id] = 0;
	int _end = min(id*len,n);
	fo(i,(id-1)*len+1,_end)
		blo[id][ptr[id]++] = a[i];
	sort(blo[id],blo[id]+ptr[id]);
}

void Add(int l,int r,int delta)
{
	int sid = id[l],eid = id[r];
	if(sid==eid)
	{
		fo(i,l,r)
			a[i] += delta;
		Resort(sid);
		rtn; 
	}
	for(int i=l;id[i]==sid;++i)a[i]+=delta;
	Resort(sid);
	for(int i=sid+1;i<eid;++i) b[i]+=delta;
	for(int i=r;id[i]==eid;--i)a[i]+=delta;
	Resort(eid);
}

int Query(int l,int r,int delta)
{
	int sid = id[l],eid = id[r],cnt = 0;
	if(sid == eid)
	{
		fo(i,l,r)
			if(a[i]+b[sid] < delta)
				++cnt;
		rtn cnt;
	}
	for(int i=l;id[i]==sid;++i)
		if(a[i]+b[sid] < delta)
			++cnt;
	for(int i=sid+1;i<eid;++i)
		cnt += lower_bound(blo[i],blo[i]+ptr[i],delta-b[i]) - blo[i];
	for(int i=r;id[i]==eid;--i)
		if(a[i]+b[eid] < delta)
			++cnt;
	rtn cnt;
}

int main()
{
	n=read();
	fo(i,1,n)a[i]=read();
	Initalize();
	fo(i,1,n)
	{
		int opt,l,r,c;
		opt=read(),l=read(),r=read(),c=read();
		if(!opt)Add(l,r,c);
		else printf("%d\n",Query(l,r,c*c));
	}
    rtn 0;
}
2021/3/31 14:26
加载中...