求助!谢谢。
  • 板块灌水区
  • 楼主cflsfzh
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/10/8 16:51
  • 上次更新2024/10/8 20:09:46
查看原帖
求助!谢谢。
429102
cflsfzh楼主2024/10/8 16:51
#include<bits/stdc++.h>
#define int long long
using namespace std;
//int read()
//{
//	int x=0;
//	int f=1; 
//	char c=getchar();
//	while(c<'0'||c>'9'){
//		if(c=='-')
//			f=-1;
//		c=getchar();
//	}
//	while(c>='0'&&c<='9'){
//		x=x*10+c-'0';
//		c=getchar();
//	}
//	return x*f;
//}
const int N=1e5+6;
const int M=1e3+6;
const int mod=1e4+7;
int n,a[N],wz[N],add[N],mul[N],kc;
void lazy(int x)
{
	for(int i=(x-1)*kc+1;i<=x*kc;i++){
		a[i]=(a[i]*mul[x])%mod;
		a[i]=(a[i]+add[x])%mod;
	}
	mul[x]=1;
	add[x]=0;
	return;
}
void add_(int l,int r,int z)
{
	if(wz[l]==wz[r]){
		lazy(wz[l]);
		for(int i=l;i<=r;i++)
			a[i]=(a[i]+z)%mod;
	}
	else{
		lazy(wz[l]);
		for(int i=l;i<=wz[l]*kc;i++)
			a[i]=(a[i]+z)%mod;
		for(int i=wz[l]+1;i<wz[r];i++)
			add[i]=(add[i]+z)%mod;
		lazy(wz[r]);
		for(int i=(wz[r]-1)*kc+1;i<=r;i++)
			a[i]=(a[i]+z)%mod;
	}
	return;
}
void Mul(int l,int r,int z)
{
	if(wz[l]==wz[r]){
		lazy(wz[l]);
		for(int i=l;i<=r;i++)
			a[i]=(a[i]*z)%mod;
	}
	else{
		lazy(wz[l]);
		for(int i=l;i<=wz[l]*kc;i++)
			a[i]=(a[i]*z)%mod;
		for(int i=wz[l]+1;i<wz[r];i++){
			add[i]=(add[i]*z)%mod;
			mul[i]=(mul[i]*z)%mod;
		}
		lazy(wz[r]);
		for(int i=(wz[r]-1)*kc+1;i<=r;i++)
			a[i]=(a[i]*z)%mod;
	}
	return;
}
signed main()
{
//	n=read();
	scanf("%lld",&n);
	kc=sqrt(n);
	for(int i=1;i<=n;i++){
//		a[i]=read();
		scanf("%lld",&a[i]);
		a[i]%=mod;
		wz[i]=(i-1)/kc+1;
		mul[i]=1;
	}
	for(int fzh=1;fzh<=n;fzh++){
		int opt,l,r,z;
//		opt=read();
//		l=read();
//		r=read();
//		z=read();
		scanf("%lld%lld%lld%lld",&opt,&l,&r,&z);
		if(!opt)
			add_(l,r,z);
		else if(opt==1)
			Mul(l,r,z);
		else if(opt==2)
			printf("%lld\n",(((a[r]*mul[wz[r]]))%mod+add[wz[r]])%mod);
	}
	return 0;
}

求调,为什么只有30分qwq。

帮帮我吧!谢谢。

题目:LibreOJ #6283. 数列分块入门 7

2024/10/8 16:51
加载中...