这份代码的时间复杂度……
查看原帖
这份代码的时间复杂度……
365654
封禁用户楼主2022/6/26 04:18

……到底是 O(mlogn)O(m \log n) 还是 O(mlog2n)O(m \log^2 n)

(不是求调,已经 AC 了)

void add(int xb,int v,int spread)
{
	all[xb]+=v;
	if(spread) while(xb>1) xb>>=1,all[xb]+=v;
}
void mdf(int l,int r,int v,int ii,int aa,int xb)//modify
{
	while(1)
	{
		if(l==ii&&r==aa) {a[xb]+=v,add(xb,(r-l+1)*v,1);return;}
		int lmid=(ii+aa)>>1,rmid=lmid+1;
		a[xb<<1]+=a[xb],add(xb<<1,(lmid-ii+1)*a[xb],0);a[(xb<<1)+1]+=a[xb],add((xb<<1)+1,(aa-rmid+1)*a[xb],0);a[xb]=0;
		if(l>=rmid) {ii=rmid;xb<<=1;xb++;continue;}
		if(r<=lmid) {aa=lmid;xb<<=1;continue;}
		if(ii==l) {a[xb<<1]+=v,add(xb<<1,(lmid-l+1)*v,1);ii=rmid;l=rmid;xb<<=1;xb++;continue;}
		if(aa==r) {a[(xb<<1)+1]+=v,add((xb<<1)+1,(r-rmid+1)*v,1);aa=lmid;r=lmid;xb<<=1;continue;}
		mdf(l,lmid,v,ii,lmid,xb<<1);mdf(rmid,r,v,rmid,aa,(xb<<1)+1);
		break;
	}
}
int qry(int l,int r,int ii,int aa,int xb)//query
{
	int ans=0;
	while(1)
	{
		if(l==ii&&r==aa) return ans+all[xb];
		int lmid=(ii+aa)>>1,rmid=lmid+1;
		a[xb<<1]+=a[xb],add(xb<<1,(lmid-ii+1)*a[xb],0);a[(xb<<1)+1]+=a[xb],add((xb<<1)+1,(aa-rmid+1)*a[xb],0);a[xb]=0;
		if(l>=rmid) {ii=rmid;xb<<=1;xb++;continue;}
		if(r<=lmid) {aa=lmid;xb<<=1;continue;}
		if(ii==l) {ans+=all[xb<<1];ii=rmid;l=rmid;xb<<=1;xb++;continue;}
		if(aa==r) {ans+=all[(xb<<1)+1];aa=lmid;r=lmid;xb<<=1;continue;}
		return ans+qry(l,lmid,ii,lmid,xb<<1)+qry(rmid,r,rmid,aa,(xb<<1)+1);
	}
}
2022/6/26 04:18
加载中...