垃圾马蜂分块WA40pts求助
查看原帖
垃圾马蜂分块WA40pts求助
362101
_TLEer_的小号楼主2021/5/9 10:21

RT.

AC On 2,4,9,10,其他WA。

Code:

#include<iostream>
#include<cmath>
#include<algorithm>
#define int long long
using namespace std;
int n,m,k,a[1000010],l,r,pos[1000010],cg[1000010],b[1000010];
char sz;
int blksz;
struct blk_T{
	int le,rt,tag;
	int erf(int k){
		return blksz-(lower_bound(b+le,b+rt+1,k-tag)-(b+le));
	}
}blk[10010];
int abr(int now){
	return pos[now];
}
bool ism(int x,int y){
	return abr(x)==abr(y);
}
void cgblk(int l,int r){
	for(int i=l;i<=r;i++)b[i]=a[i];
	sort(b+l,b+r+1);
}
void addblk(){
	blksz=sqrt(n);
	int blktot=0;
	for(int i=0;i<n;i++){
		pos[i]=blktot;
		b[i]=a[i];
		if(i>=(blktot+1)*blksz-1){
			blk[blktot].le=blktot*blksz;
			blk[blktot].rt=min(blk[blktot].le+blksz-1,n-1);
			// system("pause");
			blktot++;
			cgblk(blk[blktot].le,blk[blktot].rt);
		}
	}
	blk[blktot].le=blktot*blksz;
	blk[blktot].rt=min(blk[blktot].le+blksz-1,n-1);
	cgblk(blk[blktot].le,blk[blktot].rt);
//	cout<<blktot<<' '<<blk[blktot].le<<' '<<blk[blktot].rt<<endl;
}
void add(int le,int rt,int k){
	if(ism(le,rt)){
		for(int i=le;i<=rt;i++)
			a[i]+=k;
		cgblk(blk[abr(rt)].le,blk[abr(rt)].rt);
		return;
	}
	int lb=abr(le),rb=abr(rt);
	add(le,blk[lb].rt,k);
	add(blk[rb].le,rt,k);
	lb++;rb--;
	for(int i=lb;i<=rb;i++)
		blk[i].tag+=k;
}
int ask(int le,int rt,int k){
	int ans=0;
//	cout<<le<<' '<<rt<<' '<<ism(le,rt)<<endl;
	if(ism(le,rt)){
		for(int i=le;i<=rt;i++)
			if(a[i]+blk[abr(rt)].tag>=k)
				ans++;
		return ans;
	}
	int lb=abr(le),rb=abr(rt);
	ans+=ask(le,blk[lb].rt,k)+ask(blk[rb].le,rt,k);
	lb++;rb--;
	for(int i=lb;i<=rb;i++)
		ans+=blk[i].erf(k);
	return ans;
}
signed main(){
	cin>>n>>m;
	for(int i=0;i<n;i++)cin>>a[i];
	addblk();
	for(int i=0;i<m;i++){
		cin>>sz>>l>>r>>k;
		l--,r--;
		if(sz=='M'){
			add(l,r,k);
		}
		else{
			cout<<ask(l,r,k)<<endl;
		}
	}
	return 0;
}
2021/5/9 10:21
加载中...