50WA玄关求调
查看原帖
50WA玄关求调
949182
taoruichen楼主2024/4/1 23:11

前五个点AC,四个WA,最后一个RE,谢谢大佬

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;
const LL NO = 1e15;
const int N = 1e6 + 7; 
struct node{
	int l,r;
	LL ma,add,cov;
}tree[N << 4];
int n,q,op;
int a[N];

int ls(int k){return k<<1;}
int rs(int k){return k<<1|1;}

void f(int p,int v){
	tree[p].add += v;
	tree[p].ma += v;
}



void push_up(int p){
	tree[p].ma = max(tree[ls(p)].ma,tree[rs(p)].ma);
}

void build(int p,int l,int r){
	tree[p].l = l,tree[p].r = r,tree[p].cov = NO;
	if(l == r){
		tree[p].ma = a[l];
		return ;
	}
	int mid = l + r >> 1;
	build(ls(p),l,mid);
	build(rs(p),mid+1,r);
	push_up(p);
}

void cover(int p){
	if(tree[p].cov == NO) return ;
	tree[ls(p)].add = tree[rs(p)].add = 0;
	tree[ls(p)].cov = tree[p].cov;
	tree[ls(p)].ma = tree[ls(p)].cov;
	tree[rs(p)].cov = tree[p].cov;
	tree[rs(p)].ma = tree[rs(p)].cov;
	tree[p].cov = NO;
}

void push_down(int p){
	cover(p);
	if(!tree[p].add) return ;
	cover(p);
	f(ls(p),tree[p].add);
	f(rs(p),tree[p].add);
	tree[p].add = 0;
}

void change(int p,int x,int y,int v){
	if(tree[p].l >= x && tree[p].r <= y){
		tree[p].add = 0;
		tree[p].cov = v;
		tree[p].ma = v;
		return ;
	}
	int mid = tree[p].l + tree[p].r >> 1;
	push_down(p);
	if(x <= mid) change(ls(p),x,y,v);
	if(y > mid) change(rs(p),x,y,v);
	push_up(p);
}

void update(int p,int x,int y,int v){
	if(tree[p].l >= x && tree[p].r <= y){
		cover(p);
		tree[p].add += v;
		tree[p].ma += v;
		return ;
	}
	int mid = tree[p].l + tree[p].r >> 1;
	push_down(p);
	if(x <= mid) update(ls(p),x,y,v);
	if(y > mid) update(rs(p),x,y,v);
	push_up(p);
}

LL query(int p,int x,int y){
	if(tree[p].l >= x && tree[p].r <= y)
		return tree[p].ma;
	push_down(p);
	int mid = tree[p].l + tree[p].r >> 1;
	LL res = -INT_MAX;
	if(x <= mid) res = max(res,query(ls(p),x,y));
	if(y > mid) res = max(res,query(rs(p),x,y));
	return res;
}

int main(){
	scanf("%d%d",&n,&q);
	for(int i = 1;i <= n;i++) scanf("%d",&a[i]);
	build(1,1,n);
	int l,r,x;
	while(q--){
		scanf("%d%d%d",&op,&l,&r);
		if(op == 1){
			scanf("%d",&x);
			change(1,l,r,x);
		}else if(op == 2){
			scanf("%d",&x);
			update(1,l,r,x);
		}else printf("%lld\n",query(1,l,r));
	}
	return 0;
}

2024/4/1 23:11
加载中...