样例过了但是0分求调
查看原帖
样例过了但是0分求调
776232
zhizhizhiwang楼主2023/10/17 18:58

代码如下

#include<bits/stdc++.h>
#define ull unsigned long long
#define out(a); for(int opopop = 0;opopop < (sizeof a)/sizeof a[1];opopop++){printf("%d ",a[opopop]);}printf("\n");


using namespace std;

const int N = 1e5+5;

ull d[4*N],b[4*N],m[4*N],a[N];
int mod;


void build(int s, int t, int p) {
  	if (s == t) 
	{
    	d[p] = a[s] % mod;
    	return;
  	}
  	int mid = s + ((t - s) >> 1);

  	build(s, mid, p * 2);
	build(mid + 1, t, p * 2 + 1);
	
	d[p] = d[p * 2] + d[(p * 2) + 1];
	d[p] %= mod;
    b[p] = 0;
	m[p] = 1;
}

void update(int l,int r, int c,int s,int t,int p,int mul)
{
	if(l <= s and t <= r)
	{
		d[p] *= mul;
		d[p] %= mod;
		
		d[p] += (t - s + 1) * c;
		d[p] %= mod;
		
		b[p] += c * mul;
		b[p] %= mod;
		m[p] *= mul;
		m[p] %= mod;
		return;
	}
	
	int mid = s + ((t - s) >> 1);
	
	if( (b[p] != 0 or m[p] != 1) and s != t)
	{
		d[p * 2] *= m[p];
		d[p * 2] %= mod;
		
		d[p * 2] += b[p] * (mid - s + 1);
		d[p * 2] %= mod;
		
		d[2 * p + 1] *= m[p];
		d[p * 2 + 1] %= mod;
		
		d[2 * p + 1] += b[p] * (t - mid);
		d[p * 2 + 1] %= mod;
		
		b[p] = 0;
		m[p] = 1;
	}
	if(l <= mid)update(l,r,c,s,mid,p*2,mul);
	if(r > mid)update(l,r,c,mid+1,t,p*2+1,mul);
	d[p] = d[p * 2] + d[p * 2 + 1];
	d[p] %= mod;
}

int getsum(int l,int r,int s,int t, int p)
{
	if(l <= s and t <= r)return d[p];
	int mid = s + ((t - s) >> 1);
	if(b[p] != 0 or m[p] != 1)
	{
		d[p * 2] *= m[p];
		d[p * 2] %= mod;
		
		d[p * 2] += b[p] * (mid - s + 1);
		d[p * 2] %= mod;
		
		d[p * 2 + 1] *= m[p];
		d[p * 2 + 1] %= mod;
		
		d[p * 2 + 1] += b[p] * (t - mid);
		d[p * 2 + 1] %= mod;
		
		
		b[p * 2] += b[p];
		b[p * 2 + 1] += b[p];
		m[p * 2] *= m[p];
		m[p * 2 + 1] *= m[p];
		b[p] = 0;
		m[p] = 1;
		b[p * 2] %= mod;
		b[p * 2 + 1] %= mod;
		m[p * 2] %= mod;
		m[p * 2 + 1] %= mod;
	
	}
	ull sum = 0;
	if(l <= mid)sum = getsum(l,r,s,mid,p * 2);
	if(r > mid)sum += getsum(l,r,mid+1,t,p * 2 + 1);
	sum %= mod;
	return sum;
}



int n;
int main()
{
	//cout << "0";
	scanf("%d %d\n",&n,&mod);
	//mod = 0x3f3f3f3f;
    //cout << "0";
	for(int i = 1;i <= n;i++)
	{
		scanf("%d ",&a[i]);
	}
	//cout << "1";
	build(1,n,1);
	
	int m = 0;
	scanf("\n%d",&m);
	
	int t,g,c,o;
	t = g = c = o = 0;
	for(int i = 0;i <= m;i++)
	{
		scanf("\n%d ",&o);
		switch(o)
		{
			case 1:
				scanf("%d %d %d",&t,&g,&c);
				update(t,g,0,1,n,1,c%mod);
				break;
			case 2:
				scanf("%d %d %d",&t,&g,&c);
				update(t,g,c%mod,1,n,1,1);
				break;
			case 3:
				scanf("%d %d",&t,&g);
				ull mul = getsum(t,g,1,n,1);
				printf("%llu\n",mul % mod);
				break;
		}
        o = 0;
	}
	return 0;
}
2023/10/17 18:58
加载中...