线段树TLE#35求助!
查看原帖
线段树TLE#35求助!
691641
Grow_楼主2025/1/12 11:52

RT

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,a[1000005],op,x,y,k;
struct tree{
	int tree[4000005][3],d[4000005];
	void build(int id,int l,int r){
		if(l==r){
			tree[id][0] = tree[id][1] = tree[id][2] = 1;
			return;
		}
		int mid = (l+r)/2;
		build(id*2,l,mid);
		build(id*2+1,mid+1,r);
		tree[id][0] = (tree[id*2][0]==mid-l+1&&d[mid+1]>=0?tree[id*2][0]+tree[id*2+1][0]:tree[id*2][0]);
		tree[id][1] = (tree[id*2+1][1]==r-mid&&d[mid+1]>=0?tree[id*2][1]+tree[id*2+1][1]:tree[id*2+1][1]);
		tree[id][2] = max(max(tree[id*2][2],tree[id*2+1][2]),max(tree[id][0],tree[id][1]));
		if(d[mid+1]>=0)tree[id][2] = max(tree[id][2],tree[id*2][1]+tree[id*2+1][0]);
		return;
	}
	void update(int id,int x,int l,int r,int p){
		if(l==r&&l==x){
			d[x]+=p;
			tree[id][0] = tree[id][1] = tree[id][2] = 1;
			return;
		}
		int mid = (l+r)/2;
		if(mid>=x)update(id*2,x,l,mid,p);
		if(mid<x)update(id*2+1,x,mid+1,r,p);
		tree[id][0] = (tree[id*2][0]==mid-l+1&&d[mid+1]>=0?tree[id*2][0]+tree[id*2+1][0]:tree[id*2][0]);
		tree[id][1] = (tree[id*2+1][1]==r-mid&&d[mid+1]>=0?tree[id*2][1]+tree[id*2+1][1]:tree[id*2+1][1]);
		tree[id][2] = max(max(tree[id*2][2],tree[id*2+1][2]),max(tree[id][0],tree[id][1]));
		if(d[mid+1]>=0)tree[id][2] = max(tree[id][2],tree[id*2][1]+tree[id*2+1][0]);
		return;
	}
	int query(int id,int idl,int idr,int l,int r,int op){
		if(idl>=l&&idr<=r)return tree[id][op];
		int mid = (idl+idr)/2,ans = 0;
		if(op==0){
			if(mid>=l){
				ans = query(id*2,idl,mid,l,r,0);
				if(mid<r&&d[mid+1]>=0&&ans==mid-max(idl,l)+1)ans+=query(id*2+1,mid+1,idr,l,r,0);
			}
			else ans = query(id*2+1,mid+1,idr,l,r,0);
		}
		if(op==1){
			if(mid<r){
				ans = query(id*2+1,mid+1,idr,l,r,1);
				if(mid>=l&&d[mid+1]>=0&&ans==min(idr,r)-mid)ans+=query(id*2,idl,mid,l,r,1);
			}
			else ans = query(id*2,idl,mid,l,r,1);
		}
		if(op==2){
			if(mid<r)ans = query(id*2+1,mid+1,idr,l,r,2);
			if(mid>=l)ans = max(ans,query(id*2,idl,mid,l,r,2));
			if(mid<r&&mid>=l&&d[mid+1]>=0)ans = max(ans,query(id*2,idl,mid,l,r,1)+query(id*2+1,mid+1,idr,l,r,0));
		}
		return ans;
	}
}tr;
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> m;
	for(int i = 1;i<=n;i++)cin >> a[i];
	a[0] = a[1];
	for(int i = 1;i<=n;i++)tr.d[i] = a[i]-a[i-1];
	tr.build(1,1,n);
	while(m--){
		cin >> op >> x >> y;
		if(y==n+1)y--;
		if(op==1){
			cin >> k;
			tr.update(1,x,1,n,k);
			if(y!=n)tr.update(1,y+1,1,n,-k);
		}
		else{
			if(x==y)cout << "Yes\n";
			else cout << (tr.query(1,1,n,x,y,2)==y-x+1?"Yes":"No") << "\n";
		}
	}
    return 0;
}
2025/1/12 11:52
加载中...