线段树 50分求调
查看原帖
线段树 50分求调
644860
boolex楼主2023/4/20 17:31
# include <bits/stdc++.h>
# define NO 0x3f3f3f3f
# define long long int
using namespace std;
const int maxn = 1000009;
int n, m ,kk, op, x,y,mod;
int a[maxn];
struct node{
	int l, r, v;
	int lazyadd, lazymul;
}tri[4*maxn];
void build(int p, int bl, int br)
{
	tri[p].l = bl;
	tri[p].r = br;
	if(bl==br){
		tri[p].v = a[bl];
		return;
	}
	int mid = (bl+br)/2;
	build(p<<1, bl, mid);
	build(p<<1|1, mid+1, br);
	tri[p].v = max(tri[p<<1].v , tri[p<<1|1].v);
}
void pushdown(int p){
    if(tri[p].lazymul!=NO){
        tri[p<<1].v = tri[p].lazymul;
        tri[p<<1|1].v = tri[p].lazymul;
        tri[p<<1].lazymul = tri[p].lazymul;
        tri[p<<1|1].lazymul = tri[p].lazymul;
        tri[p<<1].lazyadd  = 0;
        tri[p<<1|1].lazyadd = 0;
        
    }
   
       tri[p<<1].v +=tri[p].lazyadd;
       tri[p<<1|1].v+=tri[p].lazyadd;
       tri[p<<1].lazyadd+=tri[p].lazyadd;
       tri[p<<1|1].lazyadd+=tri[p].lazyadd;
   
	tri[p].lazyadd = 0;
	tri[p].lazymul = NO;
}
void update_mul(int p, int bl, int br, int k)
{
	if(bl<=tri[p].l&&br>=tri[p].r){
	tri[p].v = k;
	//cout<<tri[p].l<<" to "<<tri[p].r<<" is edited to "<<k<<endl;
	tri[p].lazyadd = 0;
	tri[p].lazymul =k;
	return;
	}
	int mid = (tri[p].l+tri[p].r)/2;
	pushdown(p);
	if(br<=mid)
	update_mul(p<<1, bl, br, k);
	else if(bl>=mid+1)
	update_mul(p<<1|1, bl, br, k);
	else{
		update_mul(p<<1, bl, br, k);
		update_mul(p<<1|1, bl, br, k);
	}
	tri[p].v = max(tri[p<<1].v, tri[p<<1|1].v);
}
void update_add(int p, int bl, int br, int k)
{
	if(bl<=tri[p].l&&br>=tri[p].r){
	tri[p].v +=  k;
	tri[p].lazyadd +=k;
	return;
	}
	int mid = (tri[p].l+tri[p].r)/2;
	pushdown(p);
	if(br<=mid)
	update_add(p<<1, bl, br, k);
	else if(bl>=mid+1)
	update_add(p<<1|1, bl, br, k);
	else{
	update_add(p<<1, bl, br, k);	
	update_add(p<<1|1, bl, br, k);
	} 
	tri[p].v = max(tri[p<<1].v, tri[p<<1|1].v);
}
int query(int p, int ql, int qr)
{
	if(tri[p].l>=ql && tri[p].r<=qr)
	return tri[p].v;
	int mid = (tri[p].l+tri[p].r)/2;
	pushdown(p);
	if(mid>=qr)return query(p<<1, ql, qr);
	else if(mid+1<=ql)return query(p<<1|1, ql, qr);
	else return max(query(p<<1|1, ql, qr),query(p<<1, ql, qr));
} 

signed main(void)
{
	for(int i = 1; i<=4*maxn; i++)
		tri[i].lazymul =NO;
	cin>>n>>m;
	for(int i = 1; i<=n; i++)
		cin>>a[i];
	build(1,1,n);
	for(int i = 1; i<=m; i++)
	{
		cin>>op;
		if(op==1)
		{
			cin>>x>>y>>kk;
			update_mul(1, x, y, kk);
		}
		if(op==2)
		{
			cin>>x>>y>>kk;
			update_add(1,x, y,kk);
		}
		if(op==3)
		{
			cin>>x>>y;
			int t = query(1,x, y);
			cout<<t<<endl;
		}
	}
	return 0;
}

6-9wa 10tle

2023/4/20 17:31
加载中...