样例没过,不知道怎么改
查看原帖
样例没过,不知道怎么改
661096
asas111楼主2023/9/17 11:12
#include<bits/stdc++.h>
#define ll long long
#define N 100009
using namespace std;
ll a[N],b[N],c[N],d[N],e[N],q;
ll n,m,L;
void add(ll l,ll r,ll z){
	ll p=min(r,b[l]*L);
	for(ll i=l;i<=p;i++)a[i]+=z;
	if(b[l]!=b[r])
		for(ll i=b[r]*L-L+1;i<=r;i++)a[i]+=z;
	for(int k=b[l]+1;k<=b[r]-1;k++)c[k]+=z;
}
void mul(ll l,ll r,ll z){
	ll p=min(r,b[l]*L);
	for(ll i=l;i<=p;i++)a[i]*=z;
	if(b[l]!=b[r])
		for(ll i=b[r]*L-L+1;i<=r;i++)a[i]*=z;
	for(int k=b[l]+1;k<=b[r]-1;k++)c[k]*=z;
	for(int k=b[l]+1;k<=b[r]-1;k++)d[k]*=z;
}
ll rsq(ll l,ll r){
	ll s=0;
	if(b[l]==b[r])
		for(ll i=l;i<=r;i++)s=(s+a[i]*d[b[i]]+c[b[i]])%q;
	else{
		for(ll i=l;b[i]==b[l];i++)s=(s+a[i]*d[b[i]]+c[b[i]])%q;
		for(ll i=r;b[i]==b[r];i--)s=(s+a[i]*d[b[i]]+c[b[i]])%q;
		cout<<"s1:"<<s<<endl;
		for(ll k=b[l]+1;k<=b[r]-1;k++)s=(s+e[k]*d[k]+c[k]*L)%q;
		cout<<"s2:"<<s<<endl;
	}
	return s;
}
int main(){
	cin>>n>>m>>q;
	L=sqrt(n);
	for(ll i=1;i<=n;i++)cin>>a[i];
	for(ll i=1;i<=n;i++)b[i]=(i-1)/L+1;
	for(ll i=1;i<=n;i++)d[i]=1;
	for(ll i=1;i<=n;i++)e[b[i]]+=a[i];
	for(ll i=1;i<=m;i++){
		ll t,x,y,z;
		cin>>t;
		if(t==1){cin>>x>>y>>z;mul(x,y,z);}
		else if(t==2){cin>>x>>y>>z;add(x,y,z);}
		else{cin>>x>>y;cout<<rsq(x,y)%q<<endl;}
		cout<<"arr:";for(ll i=1;i<=n;i++)cout<<a[i]*d[b[i]]+c[b[i]]<<" ";cout<<endl;
	}
	return 0;
}

加了一些调试语句,发现是

for(ll k=b[l]+1;k<=b[r]-1;k++)s=(s+e[k]*d[k]+c[k]*L)%q;

这一行导致答案出错,但蒟蒻不知道怎么修改

2023/9/17 11:12
加载中...