求助卡常
查看原帖
求助卡常
226148
Suuon_Kanderu楼主2020/8/19 08:34

人傻常数大。。。连这种题都过不了。。。

rp最好的一次

#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdio>
using namespace std;
typedef long long ll;
const int N = (1e6)*4;
int p;
int read(){
    int x=0;
    char ch;
    do ch=getchar();while (ch<'0'||ch>'9');
    while (ch>='0' && ch<='9') x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
    return x;
}
void print(ll x) {
    if(x < 0) putchar('-'), x = -x;
    if(x > 9) print(x / 10);
    putchar(x % 10 + '0');
}
 
int data[N];ll val[N];ll add[N],mul[N];
void pushdown(int now,int l,int r) {
	int l1 = now<<1,l2 = now<<1|1,mid = (l+r)>>1;	
	int lenl = mid-l+1,lenr = r-(mid+1)+1;
	val[l1] = (mul[now] * val[l1]%p + //计算mul的贡献 
				(add[now]%p * lenl%p)%p)%p;//add的
	val[l2] = (mul[now] * val[l2]%p +
				(add[now]%p * lenr%p)%p)%p;
	add[l1] = (add[l1] * mul[now]%p + add[now])%p;
	add[l2] = (add[l2] * mul[now]%p + add[now])%p;
	mul[l1] = (mul[now]%p * mul[l1]%p)%p;
	mul[l2] = (mul[now]%p * mul[l2]%p)%p;
	mul[now] = 1;
	add[now] = 0;
}
void pushup(int now) {
	val[now] = (val[now<<1]%p + val[now<<1|1]%p)%p;
}
void build(int l,int r,int now) {        
    mul[now] = 1;
    add[now] = 0;
	if(l == r) {
		val[now] = data[l];
		return ;
	}
	ll mid = (l+r)>>1;
	build(l,mid,now<<1);
	build(mid+1,r,now<<1|1);
	pushup(now);
}
void change_mul(int l,int r,int x,int y,int now,int v) {
    pushdown(now,l,r);
	if(x <= l && r <= y) {
		mul[now] = (mul[now]%p * v%p)%p;
		add[now] = (add[now]%p * v%p)%p;
		val[now] = (val[now]%p * v%p)%p;
		return ;
	}
	
	ll mid = (l+r)>>1;
	if(x <= mid)change_mul(l,mid,x,y,now<<1,v);
	if(y >= mid+1)change_mul(mid+1,r,x,y,now<<1|1,v);
	pushup(now);
}
void change_add(int l,int r,int x,int y,int now,int v) {
    pushdown(now,l,r);
	if(x <= l && r <= y) {
		add[now] = (add[now]%p + v%p)%p;
		val[now] = (val[now]%p + (r-l+1)*v%p)%p;
		return ;
	}
	ll mid = (l+r)>>1;
	if(x <= mid)change_add(l,mid,x,y,now<<1,v);
	if(y >= mid+1)change_add(mid+1,r,x,y,now<<1|1,v); 
	pushup(now);
}
ll query(int l,int r,int x,int y,int now) {
    pushdown(now,l,r);
	if(x <= l && r <= y) {
        return val[now];
    }
    
	int mid = (l+r)>>1;
	int ans = 0;
	if(x <= mid)ans = (ans%p + query(l,mid,x,y,now<<1)%p)%p;
	if(y >= mid+1)ans = (ans%p + query(mid+1,r,x,y,now<<1|1)%p)%p;
	return ans;
}
int main() {
	int n,m;
	n = read();p = read();
	for(int i = 1; i <= n; i++)
		data[i] = read();
	build(1,n,1);
	int op,x,y,k;
    m = read();
	while(m--) {	
		op = read();
		if(op == 1) {
		    x = read(); y = read();k = read();
			change_mul(1,n,x,y,1,k);
		}
		if(op == 2) {
		    x = read(); y = read();k = read();
			change_add(1,n,x,y,1,k);
		}
		if(op == 3) {
		    x = read(); y = read();
		    print(query(1 , n , x , y , 1)%p);
		    puts("");
		}
	}
	return 0;
} 
2020/8/19 08:34
加载中...