分块各种 WA RE(杨丽一锅)
查看原帖
分块各种 WA RE(杨丽一锅)
926886
kind_Ygg楼主2024/10/11 15:12
#include<bits/stdc++.h>
#define int long long 
using namespace std;
const int N=2e5+5;
const int M=sqrt(N)+5;
int n,m;
char op;
int x,y,k,ans;
int sum[M],a[N],in[N];
int b[M][M];
int st[N],fn[N];
int bloxd,len;
bool cmp(int a,int b){return a<b;}
void update(int s,int t,int k)
{
	int S=in[s],T=in[t];
	for(int i=S+1;i<=T-1;i++) sum[i]+=k;
	//整块
	for(int i=s;i<=fn[S];i++) 
		a[i]+=k;
	for(int i=st[S];i<=fn[S];i++)
		b[S][i-st[S]+1]=a[i];
	sort(b[S]+1,b[S]+(fn[S]-st[S]+1)+1,cmp);
	//左碎
	for(int i=st[T];i<=t;i++)
		a[i]+=k;
	for(int i=st[T];i<=fn[T];i++) 
		b[T][i-st[T]+1]=a[i];
	sort(b[T]+1,b[T]+(fn[T]-st[T]+1)+1,cmp);
	//右碎
}
int query(int s,int t,int c)
{
	ans=0;
	int S=in[s],T=in[t];
	for(int i=in[s]+1;i<=in[t]-1;i++)
	{
		int k=lower_bound(b[i]+1,b[i]+(fn[i]-st[i]+1)+1,c-sum[i])-b[i];
		if(upper_bound(b[i]+1,b[i]+(fn[i]-st[i]+1)+1,c-sum[i])-b[i]!=k) k++;
		ans+=bloxd-k+1;
	}
	//整块
	int k=lower_bound(b[S]+(s-st[S]+1),b[S]+(fn[S]-st[S]+1)+1,c-sum[S])-b[S];
	if(upper_bound(b[S]+(s-st[S]+1),b[S]+(fn[S]-st[S]+1)+1,c-sum[S])-b[S]!=k) k++;
	ans+=bloxd-k+1;
	k=lower_bound(b[T]+1,b[T]+(t-st[T]+1)+1,c-sum[T])-b[T];
	if(upper_bound(b[T]+1,b[T]+(t-st[T]+1)+1,c-sum[T])-b[T]!=k) k++;
	ans+=bloxd-k+1;
	return ans;
}
signed main()
{
	cin>>n;
	cin>>m;
	bloxd=sqrt(n);//块长
	len=n/bloxd;//块数5 3
	if(n%bloxd) len++;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=len;i++)
	{
		st[i]=(i-1)*bloxd+1;
		if(i==len) fn[len]=n;
		else fn[i]=i*bloxd;
		for(int j=st[i];j<=fn[i];j++) b[i][j-st[i]+1]=a[j],in[j]=i;
		sort(b[i]+1,b[i]+(fn[i]-st[i]+1)+1,cmp);
	}//分块+排序
	while(m--)
	{
		cin>>op>>x>>y>>k;
		if(op=='M') update(x,y,k);
		else cout<<query(x,y,k)<<'\n';
	}
	return 0;
}
2024/10/11 15:12
加载中...