悬赏5RMB求调,全WA
查看原帖
悬赏5RMB求调,全WA
467107
Cap1taL楼主2022/7/28 20:25

样例过,全wa 线段树定义的结构体,maxh是maxhistory,其他差不多

lazytag1和3是关于最大值的,2和4是不关于最大值的

调了一晚上了没调出来,调出来加我Q:1919363089商议报酬QAQ

(第一个数据点有负数,但输出没有一点负数)

部分结构体的变量写成define了,比如#define tr(p)

云剪切板或下方,谢谢了QAQ蒟蒻硬撑着学的

// Problem: P6242 【模板】线段树 3
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P6242
// Memory Limit: 500 MB
// Time Limit: 3500 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define int long long
#define INF 0x7fffffff
#define MAXN 500005
#define MAXM 10003
#define foru(a,b,c)	for(int a=b;a<=c;a++)
#define ford(a,b,c)	for(int a=b;a>=c;a--)
#define RT return 0;
#define db(x)	cout<<endl<<x<<endl;
#define LL long long
#define LXF int
#define RIN rin()
#define HH printf("\n")
#define lz1(p)	tr[p].lazytag1
#define lz2(p)	tr[p].lazytag2
#define lz3(p)	tr[p].lazytag3
#define lz4(p)	tr[p].lazytag4
#define tsum(p)	tr[p].sum
#define tmax(p)	tr[p].maxa
#define tsec(p)	tr[p].sec
#define tcnt(p)	tr[p].cnt
#define tmah(p)	tr[p].maxh
#define tl(p)	tr[p].l
#define tr(p)	tr[p].r
using namespace std;
inline LXF rin() {
    LXF a=0;char c=getchar();
    while(c<'0'||c>'9') c=getchar();
    while(c>='0'&&c<='9') a=(a<<1)+(a<<3)+c-'0',c=getchar();
    return a;
}
inline void out(LXF n){
    if(n==0) return;
    out(n/10);
    putchar(n%10+'0');
}
int n,m,a[MAXN];
struct SegTree{
	int l,r,sum,maxa,sec,maxh,cnt;
	int lazytag1,lazytag2,lazytag3,lazytag4;
	void clear(){
		lazytag1=lazytag2=lazytag3=lazytag4=0;
	}
}tr[MAXN<<2];
inline int lc(int x){return x<<1;}
inline int rc(int x){return (x<<1)+1;} 
inline void push_up(int p){
	tsum(p)=tsum(lc(p))+tsum(rc(p));
	tmax(p)=max(tmax(lc(p)),tmax(rc(p)));
	tmah(p)=max(tmah(p),tmax(p));
	if(tmax(lc(p))>tmax(rc(p))){
		tsec(p)=max(tsec(lc(p)),tmax(rc(p)));
		tcnt(p)=tcnt(lc(p));
	}else{
		if(tmax(lc(p))==tmax(rc(p))){
			tsec(p)=max(tsec(lc(p)),tsec(rc(p)));
			tcnt(p)=tcnt(lc(p))+tcnt(rc(p));
		}else{
			tsec(p)=max(tmax(lc(p)),tsec(rc(p)));
			tcnt(p)=tcnt(rc(p));
		}
	}
}
void build(int p,int l,int r){
	tl(p)=l,tr(p)=r;
	tr[p].clear();
	if(l==r){
		tsum(p)=tmax(p)=tmah(p)=a[l];
		tcnt(p)=1;
		tsec(p)=-2e9;
		return ;
	}
	int mid=(tl(p)+tr(p))>>1;
	build(lc(p),tl(p),mid);
	build(rc(p),mid+1,tr(p));
	push_up(p);
}
void update(int p,int k1,int k2,int k3,int k4){
	tsum(p)+=1ll*tcnt(p)*k1+1ll*(tr(p)-tl(p)+1-tcnt(p))*k2;
	tmah(p)=max(tmah(p),tmax(p)+k3);
	lz3(p)=max(lz3(p),lz1(p)+k3);
	lz4(p)=max(lz4(p),lz2(p)+k4);
	lz1(p)+=k1,lz2(p)+=k2,tmax(p)+=k1;	
	if(tsec(p)!=-2e9)	tsec(p)+=k2;
}
void push_down(int p){
	int maxx=max(tmax(lc(p)),tmax(rc(p)));
	if(tmax(lc(p))==maxx)	update(lc(p),lz1(p),lz2(p),lz3(p),lz4(p));
	else	update(lc(p),lz2(p),lz2(p),lz4(p),lz4(p));
	if(tmax(rc(p))==maxx)	update(rc(p),lz1(p),lz2(p),lz3(p),lz4(p));
	else	update(rc(p),lz2(p),lz2(p),lz4(p),lz4(p));
	tr[p].clear();
}
int qurey_tsum(int p,int nl,int nr){
	if(tl(p)>nr||tr(p)<nl)	return 0;
	if(nl<=tl(p)&&tr(p)<=nr)	return tsum(p);
	push_down(p);
	return qurey_tsum(lc(p),nl,nr)+qurey_tsum(rc(p),nl,nr);
}
int qurey_tmax(int p,int nl,int nr){
	if(tl(p)>nr||tr(p)<nl)	return -2e9;
	if(nl<=tl(p)&&tr(p)<=nr)	return tmax(p);
	push_down(p);
	return max(qurey_tmax(lc(p),nl,nr),qurey_tmax(rc(p),nl,nr));
}
int qurey_tmah(int p,int nl,int nr){
	if(tl(p)>nr||tr(p)<nl)	return -2e9;
	if(nl<=tl(p)&&tr(p)<=nr)	return tmah(p);
	push_down(p);
	return max(qurey_tmah(lc(p),nl,nr),qurey_tmah(rc(p),nl,nr));
}
void modify_add(int p,int nl,int nr,int k){
	if(tr(p)<nl||tl(p)>nr)	return ;
	if(nl<=tl(p)&&tr(p)<=nr){
		update(p,k,k,k,k);
		return ;
	}
	push_down(p);
	modify_add(lc(p),nl,nr,k);
	modify_add(rc(p),nl,nr,k);
	push_up(p);
}
void modify_min(int p,int nl,int nr,int k){
	if(tr(p)<nl||tl(p)>nr||tmax(p)<=k){
		return ;
	}	
	if(nl<=tl(p)&&tr(p)<=nr&&tsec(p)<k){
		
		update(p,k-tmax(p),0,k-tmax(p),0);
		return ;
	}
	push_down(p);
	modify_min(lc(p),nl,nr,k);
	modify_min(rc(p),nl,nr,k);
	push_up(p);
}
signed main(){
	n=RIN,m=RIN;
	foru(i,1,n)	a[i]=RIN;
	build(1,1,n);
	while(m--){
		int op=RIN,x=RIN,y=RIN,k;
		switch(op){
			case 1:
				k=RIN;
				modify_add(1,x,y,k);
				break;
			case 2:
				k=RIN;
				// cout<<"危"<<endl;
				modify_min(1,x,y,k);
				break;
			case 3:
				cout<<qurey_tsum(1,x,y)<<endl;
				break;
			case 4:
				cout<<qurey_tmax(1,x,y)<<endl;
				break;
			case 5:
				cout<<qurey_tmah(1,x,y)<<endl;
				break;
		}
	}
	return 0;
}
2022/7/28 20:25
加载中...