调一天还是只有30分,求大佬
查看原帖
调一天还是只有30分,求大佬
1176677
Xwei2051楼主2024/3/9 23:33

只过了样例1、3、4,找了好久一直找不到问题qwq求大佬

#include<iostream>  
#include<iomanip>  
#include<cstdio>
#include<stdio.h>
#include<cstdlib>
#include<ctime>
#include<algorithm>
#include<string>
#include<string.h>
#include<cstring>
#include<vector>
#include<stack>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
#include<utility>
#include<bitset>
#include<limits.h>
#include<iterator>
#include<numeric>
//#pragma GCC optimize (2)
//#pragma G++ optimize (2)//手动开o2
#define ls (p<<1)//线段树左儿子
#define rs (p<<1|1)//线段树右儿子
#define mid (l+r>>1)//线段树mid
#define over(i,s,t) for(int i=s;i<=t;i++)
#define lver(i,t,s) for(int i=t;i>=s;i--)
#define IOS ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
#define lowbit(x) (x&-x)
//#define int _int128//水大数
using namespace std;
//#undef mid;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;

const int N = 1e5 + 5;
const LL mod = 1e9 + 7;
const LL INF = 0x3f3f3f3f;
const double PI=acos(-1);
const double EPS = 1e-10;//可近似为趋近0,可以根据定义求导时使用
const int base = 131;//base=1331//hash
int n,q,w;
LL a[N];
struct node{
	int l,r;LL lazix,laziy=1,sum;
}tr[4*N+5];
void build(int p,int x,int y){
	tr[p].l=x,tr[p].r=y;
	if(x==y){
		tr[p].sum=a[x]%w;
		return;
	}
	int m=x+y>>1;
	build(ls,x,m);
	build(rs,m+1,y);
	tr[p].sum=(tr[ls].sum+tr[rs].sum)%w;
}
void pushdown(int p){
	if(tr[p].laziy!=1){
		tr[ls].sum=(tr[ls].sum*tr[p].laziy)%w;
		tr[rs].sum=(tr[rs].sum*tr[p].laziy)%w;
		tr[ls].laziy=(tr[ls].laziy*tr[p].laziy)%w;
		tr[rs].laziy=(tr[rs].laziy*tr[p].laziy)%w;
		tr[p].laziy=1;
	}
	if(tr[p].lazix){
		tr[ls].sum=(tr[ls].sum+tr[p].lazix*(tr[ls].r-tr[ls].l+1)%w)%w;
		tr[rs].sum=(tr[rs].sum+tr[p].lazix*(tr[rs].r-tr[rs].l+1)%w)%w;
		tr[ls].lazix=(tr[ls].lazix+tr[p].lazix)%w;
		tr[rs].lazix=(tr[rs].lazix+tr[p].lazix)%w;
		tr[p].lazix=0;
	}
}
void pushup(int p){
	tr[p].sum=(tr[ls].sum+tr[rs].sum)%w;
}
void update1(int p,int x,int y,LL k){
	if(x<=tr[p].l&&y>=tr[p].r){
		tr[p].sum=(tr[p].sum+k*(tr[p].r-tr[p].l+1)%w)%w;
		tr[p].lazix=(tr[p].lazix+k)%w;
		return;
	}
	pushdown(p);
	int m=tr[p].l+tr[p].r>>1;
	if(x<=m)update1(ls,x,y,k);
	if(y>m)update1(rs,x,y,k);
	pushup(p);
}
void update2(int p,int x,int y,LL k){
	if(x<=tr[p].l&&y>=tr[p].r){
		tr[p].sum=(tr[p].sum*k)%w;
		tr[p].lazix=(tr[p].lazix*k)%w;
		tr[p].laziy=(tr[p].laziy*k)%w;
		return;
	}
	pushdown(p);
	int m=tr[p].l+tr[p].r>>1;
	if(x<=m)update2(ls,x,y,k);
	if(y>m)update2(rs,x,y,k);
	pushup(p);
}
LL query(int p,int x,int y){
	LL res=0;
	if(x<=tr[p].l&&y>=tr[p].r){
		return tr[p].sum%w;
	}
	pushdown(p);
	int m=tr[p].l+tr[p].r>>1;
	if(x<=m)res=(res+query(ls,x,y))%w;
	if(y>m)res=(res+query(rs,x,y))%w;
	return res;
}
int main()
{
	IOS;cin>>n>>q>>w;
	over(i,1,n)cin>>a[i];
	build(1,1,n);
	while(q--){
		int op;cin>>op;
		if(op==1){
			int x,y;LL k;cin>>x>>y>>k;
			update2(1,x,y,k);
		}
		else if(op==2){
			int x,y;LL k;cin>>x>>y>>k;
			update1(1,x,y,k);
		}
		else{
			int x,y;cin>>x>>y;
			cout<<query(1,x,y)<<endl;
		}
	}
	return 0;
}
2024/3/9 23:33
加载中...