样例过了,40pts求调
查看原帖
样例过了,40pts求调
498526
htssm楼主2021/11/23 20:00
#include<bits/stdc++.h>
#define ll long long
#define un unsigned
using namespace std;
template<typename T> inline void read(T &x){
	x=0;char c=getchar();bool flag=false;
	while(!isdigit(c)){if(c=='-')flag=true;c=getchar();}
	while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
	if(flag)x=-x;
}
template<typename T> inline void write(T x){
   	short st[30],tp=0;
	if(x<0) putchar('-'),x=-x;
	do st[++tp]=x%10,x/=10; while(x);
	while(tp) putchar('0'|st[tp--]);
}
#define wr write
#define rd read
#define pk putchar(' ')
#define ed puts("")
#define ls(p) p<<1
#define rs(p) p<<1|1
const int MAXN=1e6+10;
const ll INF=1145141981;
struct ltree{
	int l,r;
	ll maxn,tag1,tag2;
}t[4*MAXN];
ll a[MAXN];
void make(int p,int nl,int nr){
	t[p].tag2=-INF;
	t[p].tag1=0;
	t[p].l=nl;
	t[p].r=nr;
	//cout<<p<<" "<<nl<<" "<<nr<<endl;
	if(nl==nr){
		t[p].maxn=a[nl];
		t[p].tag1=0;
		t[p].tag2=-INF;
		return;
	}
	int mid=(nl+nr)>>1;
	make(ls(p),nl,mid);
	make(rs(p),mid+1,nr);
	t[p].maxn=max(t[ls(p)].maxn,t[rs(p)].maxn);
}
void pushdown1(int p){
	if(t[p].tag2!=-INF){
		//cout<<"!!!"<<endl;
		t[ls(p)].tag1=t[rs(p)].tag1=0;
		t[ls(p)].maxn=t[rs(p)].maxn=t[p].tag2;
		t[ls(p)].tag2=t[rs(p)].tag2=t[p].tag2;
		t[p].tag2=-INF;
	}
}
void pushdown2(int p){
	if(t[p].tag1!=0){
		pushdown1(p);
		t[ls(p)].maxn+=t[p].tag1;
        t[rs(p)].maxn+=t[p].tag1;
        t[ls(p)].tag1+=t[p].tag1;
        t[rs(p)].tag1+=t[p].tag1;
        t[p].tag1=0;
	}
}
void add(int p,int ql,int qr,int num){
	//cout<<p<<" "<<t[p].l<<" "<<t[p].r<<endl;
	if(t[p].l>=ql&&t[p].r<=qr){
		pushdown1(p);
		t[p].maxn+=num;
		t[p].tag1+=num;
		return;
	}
	pushdown1(p);
	pushdown2(p);
	int mid=(t[p].r+t[p].l)>>1;
	if(ql<=mid) add(ls(p),ql,qr,num);
	if(qr>mid) add(rs(p),ql,qr,num);
	t[p].maxn=max(t[ls(p)].maxn,t[rs(p)].maxn);
}
void cover(int p,int ql,int qr,int num){
	if(t[p].l>=ql&&t[p].r<=qr){
		t[p].tag1=0;
		t[p].maxn=num;
		t[p].tag2=num;
		return;
	}
	pushdown1(p);
	pushdown2(p);
	int mid=(t[p].r+t[p].l)>>1;
	if(ql<=mid) cover(ls(p),ql,qr,num);
	if(qr>mid) cover(rs(p),ql,qr,num);
	t[p].maxn=max(t[ls(p)].maxn,t[rs(p)].maxn);
}
int query(int p,int ql,int qr){
	if(t[p].l==t[p].r) return t[p].maxn;
	pushdown1(p);
	pushdown2(p);
	//cout<<p<<" "<<t[p].maxn<<endl;
	int mid=(t[p].l+t[p].r)>>1,ans=-INF;
	if(ql<=mid) ans=max(ans,query(ls(p),ql,qr));
	if(qr>mid) ans=max(ans,query(rs(p),ql,qr));
	return ans;
}
signed main(){
	int n,m,opt,vx,vy,vn;
	rd(n),rd(m);
	for(int i=1;i<=n;i++) rd(a[i]);
	make(1,1,n);
	while(m--){
		rd(opt),rd(vx),rd(vy);
		if(opt==1){
			rd(vn);
			cover(1,vx,vy,vn);
		}
		else if(opt==2){
			rd(vn);
			add(1,vx,vy,vn);
		}
		else if(opt==3){
			wr(query(1,vx,vy)),ed;
		}
	}
}
/*
6 6
1 1 4 5 1 4
2 1 6 1
3 1 6
*/

5个TLE,4个AC,1个RE 时间复杂度应该是对的啊

2021/11/23 20:00
加载中...