社区讨论

分块全RE求调

P2801教主的魔法参与者 3已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@lo8l6f4w
此快照首次捕获于
2023/10/27 20:25
2 年前
此快照最后确认于
2023/11/02 11:11
2 年前
查看原帖
rt
用分块写的,本地没问题,下了一组数据也没问题,一交上全RE,点了一下O2O_2结果全WA,完全查不出来,求大佬指点
CPP
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#include <cmath>
#include <vector>
#include <map>
#define pii pair<int,int>
using namespace std;
const int N=1e6+10;
int n,q,block,t;
int st[N],ed[N],pos[N];
long long a[N],add[N];

void ini()
{
	t=sqrt(n);
	block=n/t;
	if(n%block)++t;
	for(int i=1;i<=t;++i){st[i]=(i-1)*block+1;ed[i]=i*block;}
	ed[t]=n;
	for(int i=1;i<=t;++i)
	{
		for(int j=st[i];j<=ed[i];++j)pos[j]=i;
		sort(a+st[i],a+ed[i]+1);
	}
}

void change(int l,int r,long long k)
{
	int lp=pos[l],rq=pos[r];
	if(lp==rq)for(int i=l;i<=r;++i)a[i]+=k;
	else
	{
		for(int i=lp+1;i<rq;++i)add[i]+=k;
		change(l,ed[lp],k);change(st[rq],r,k);
	}
}

long long Sum(int l,int r,long long c)
{
	int lp=pos[l],rq=pos[r];
	if(lp==rq)
	{
		int tot=lower_bound(a+l,a+r+1,c-add[lp])-a;
		return r-tot+1;
	}
	else
	{
		long long ans=0;
		for(int i=lp+1;i<rq;++i)
		{
			int tot=lower_bound(a+st[i],a+ed[i]+1,c-add[i])-a;
			ans+=ed[i]-tot+1;
		}
		ans+=Sum(l,ed[lp],c)+Sum(st[rq],r,c);
		return ans;
	}
}

int main()
{
	cin>>n>>q;
	for(int i=1;i<=n;++i)scanf("%lld",&a[i]);ini();
	getchar();
	for(int i=1,l,r;i<=q;++i)
	{
		char ch;
		scanf("%c%d%d",&ch,&l,&r);
		if(ch=='M')
		{
			long long w;
			scanf("%lld",&w);
			change(l,r,w);
		}
		else
		{
			long long c;
			scanf("%lld",&c);
			printf("%lld\n",Sum(l,r,c));
		}
		getchar();
	}
	return 0;
}



回复

4 条回复,欢迎继续交流。

正在加载回复...