麻了,样例过不了
查看原帖
麻了,样例过不了
315205
Kniqht楼主2023/8/26 22:02

分块板子题,检查了半天也查不出来蚌埠住了

悬赏关注,谢谢大佬的帮助

#include<bits/stdc++.h>
#define ll long long
#define ld long double
using namespace std;
const int N=1e6+10;
int n,q;
ll lt[N],w[N],len,t[N];
int st[N],ed[N],id[N];
void Sort(int x){
	for(int i=st[x];i<=ed[x];i++) t[i]=w[i];
	sort(t+st[x],t+ed[x]+1);
} 
void add(int l,int r,int x){
	if(id[l]==id[r]){
		for(int i=l;i<=r;i++) w[i]+=x;
		Sort(id[l]); 
		return;
	}
	for(int i=l;i<=ed[id[l]];i++) w[i]+=x;
	for(int i=id[l]+1;i<id[r];i++) lt[i]+=x;
	for(int i=st[id[r]];i<=r;i++) w[i]+=x;
	Sort(id[l]);Sort(id[r]);
}
int query(int l,int r,int x){
	//************************判断>=的时候加上lazytag!!!************************** 
	int cnt=0;
	if(id[l]==id[r]){
		for(int i=l;i<=r;i++)
			if(w[i]+lt[id[l]]>=x) cnt++;
		return cnt;
	}
	for(int i=l;i<=ed[id[l]];i++) 
		if(w[i]+lt[id[l]]>=x) cnt++;
	for(int i=id[l]+1;i<id[r];i++)
		cnt+=ed[i]-(lower_bound(t+st[i],t+ed[i]+1,x-lt[i])-t)+1;
		//注意这里 lower_bound(start,end, *x-lt[i]*) 别忘了考虑lazytag 
		// 另外lower_bound用法后面只用减去一个t,不用减去1,最后记得加一(r-l+1)
	for(int i=st[id[r]];i<=r;i++)
		if(w[i]+lt[id[r]]>=x) cnt++;
	return cnt; 
}
signed main(){
	scanf("%d%d",&n,&q);
	len=sqrt(n);
	for(int i=1;i<=n;i++){
		scanf("%d",&w[i]);
		id[i]=(i-1)/len+1;//记住此公式 
		if(id[i]!=id[i-1]) st[id[i]]=i,ed[id[i-1]]=i-1;
	}
	ed[id[n]]=n;
	while(q--){
		char opt;int l,r,W;
		cin>>opt;scanf("%d%d%d",&l,&r,&W);
		if(opt=='M') add(l,r,W);
		else printf("%d\n",query(l,r,W));
	}
    return 0;   
}
2023/8/26 22:02
加载中...