求助昨晚F
  • 板块学术版
  • 楼主After_light
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/6/9 09:09
  • 上次更新2024/6/9 12:11:20
查看原帖
求助昨晚F
554803
After_light楼主2024/6/9 09:09
#include<bits/stdc++.h>
#define ll long long
#define F(i,a,b) for(ll i=a;i<=b;i++)
#define R(i,a,b) for(ll i=a;i>=b;i--)
#define sc(a) scanf("%lld",&a)
#define ps(a) printf("%lld ",a)
#define pn(a) printf("%lld\n",a)
using namespace std;
const ll N=2e5+7;
ll n,q,a[N],id[N],li[N],ri[N],b[N],sum[N],sma[N],smb[N],lk[N],rk[N],adda[N],addb[N];
const ll mod=998244353;
int main(){
	sc(n),sc(q);
	ll sz=sqrt(n);
	for(ll i=1;i<=n;i++) sc(a[i]),a[i]%=mod;
	for(ll i=1;i<=n;i++) sc(b[i]),b[i]%=mod;
	for(ll i=1;i<=n;i++){
		id[i]=(i-1)/sz+1;
		lk[i]=(id[i]-1)*sz+1;
		rk[i]=min(n,id[i]*sz);
		sum[id[i]]+=a[i]*b[i];
		sum[id[i]]%=mod;
		sma[id[i]]+=a[i];
		sma[i]%=mod;
		smb[id[i]]+=b[i];
		smb[i]%=mod;
	}
	ll cnt=(n/sz)+(n%sz!=0);
	for(ll i=1;i<=cnt;i++){
		li[i]=ri[i-1]+1;
		ri[i]=min(n,ri[i-1]+sz);
	}
	while(q--){
		ll opt,l,r,k;
		sc(opt),sc(l),sc(r);
		if(opt==1){
			sc(k);
			if(id[l]==id[r]){
			for(ll i=l;i<=r;i++){
				sum[id[i]]-=(a[i]+adda[id[i]])*(b[i]+addb[id[i]]);
				a[i]+=k;
				sma[id[i]]+=k;
				sum[id[i]]+=(a[i]+adda[id[i]])*(b[i]+addb[id[i]]);
				a[i]%=mod;
				sum[id[i]]%=mod;
				sum[id[i]]+=mod;
				sum[id[i]]%=mod;
				sma[id[i]]%=mod;
			}
			continue;
			}
			for(ll i=id[l]+1;i<=id[r]-1;i++){
				sum[i]+=k*smb[i];
				sma[i]+=(ri[i]-li[i]+1)*k;
				adda[i]+=k;
				sma[i]%=mod;
				sum[i]%=mod;
				adda[i]%=mod;
			}
			for(ll i=l;i<=rk[l];i++){
				sum[id[i]]-=(a[i]+adda[id[i]])*(b[i]+addb[id[i]]);
				a[i]+=k;
				sma[id[i]]+=k;
				sum[id[i]]+=(a[i]+adda[id[i]])*(b[i]+addb[id[i]]);
				a[i]%=mod;
				sum[id[i]]%=mod;
				sum[id[i]]+=mod;
				sum[id[i]]%=mod;
				sma[id[i]]%=mod;
			}
			for(ll i=lk[r];i<=r;i++){
				sum[id[i]]-=(a[i]+adda[id[i]])*(b[i]+addb[id[i]]);
				a[i]+=k;
				sma[id[i]]+=k;
				sum[id[i]]+=(a[i]+adda[id[i]])*(b[i]+addb[id[i]]);
				a[i]%=mod;
				sum[id[i]]%=mod;
				sum[id[i]]+=mod;
				sum[id[i]]%=mod;
				sma[id[i]]%=mod;
			}
		}
		else if(opt==2){
			sc(k);
			if(id[l]==id[r]){
			for(ll i=l;i<=r;i++){
				sum[id[i]]-=(a[i]+adda[id[i]])*(b[i]+addb[id[i]]);
				b[i]+=k;
				smb[id[i]]+=k;
				sum[id[i]]+=(a[i]+adda[id[i]])*(b[i]+addb[id[i]]);
				b[i]%=mod;
				sum[id[i]]%=mod;
				sum[id[i]]+=mod;
				sum[id[i]]%=mod;
				smb[id[i]]%=mod;
			}
			continue;
			}
			for(ll i=id[l]+1;i<=id[r]-1;i++){
				sum[i]+=k*sma[i];
				smb[i]+=(ri[i]-li[i]+1)*k;
				addb[i]+=k;
				smb[i]%=mod;
				sum[i]%=mod;
				addb[i]%=mod;
			}
			for(ll i=l;i<=rk[l];i++){
				sum[id[i]]-=(a[i]+adda[id[i]])*(b[i]+addb[id[i]]);
				b[i]+=k;
				smb[id[i]]+=k;
				sum[id[i]]+=(a[i]+adda[id[i]])*(b[i]+addb[id[i]]);
				b[i]%=mod;
				sum[id[i]]%=mod;
				sum[id[i]]+=mod;
				sum[id[i]]%=mod;
				smb[id[i]]%=mod;
			}
			for(ll i=lk[r];i<=r;i++){
				sum[id[i]]-=(a[i]+adda[id[i]])*(b[i]+addb[id[i]]);
				b[i]+=k;
				smb[id[i]]+=k;
				sum[id[i]]+=(a[i]+adda[id[i]])*(b[i]+addb[id[i]]);
				b[i]%=mod;
				sum[id[i]]%=mod;
				sum[id[i]]+=mod;
				sum[id[i]]%=mod;
				smb[id[i]]%=mod;
			}
		}
		else{
			ll ans=0;
			if(id[l]==id[r]){
			for(ll i=l;i<=r;i++){
				ans+=(a[i]+adda[id[i]])*(b[i]+addb[id[i]]);
				ans%=mod;
			}
			pn(ans);
			continue;
			}
			for(ll i=id[l]+1;i<=id[r]-1;i++){
				ans+=sum[i];
				ans%=mod;
			}
			for(ll i=l;i<=rk[l];i++){
				ans+=(a[i]+adda[id[i]])*(b[i]+addb[id[i]]);
				ans%=mod;
			}
				for(ll i=lk[r];i<=r;i++){
					ans+=(a[i]+adda[id[i]])*(b[i]+addb[id[i]]);
					ans%=mod;
				}
			pn(ans);
		}
	}
	return 0;
}
/*
5 6
1 1 1 1 1
1 1 1 1 1
1 1 3 1
3 1 3 
1 2 4 1
3 1 4
1 5 5 1
3 1 5
*/

一眼看出来,写的分块,但是挑了一晚上/kel

2024/6/9 09:09
加载中...