HDU 5306 悬2关
查看原帖
HDU 5306 悬2关
941575
Stars_visitor_tyw楼主2025/1/14 15:23

rt,RE+WA+TLE

#include<bits/stdc++.h>
#define int long long
#define lson(x) x<<1
#define rson(x) x<<1|1
using namespace std;
const int N=2e6+5;
int n, m, ans=1145141919810, a[N], tree[N<<2], mx[N<<2], md[N<<2], cnt[N<<2], tag[N<<2];
void pushup(int cur)
{
	tag[cur]=tag[lson(cur)]+tag[rson(cur)];
	if(mx[lson(cur)]==mx[rson(cur)])
	{
		mx[cur]=mx[lson(cur)],cnt[cur]=cnt[lson(cur)]+cnt[rson(cur)],md[cur]=max(md[lson(cur)],md[rson(cur)]);
		return ;
	}
	if(mx[lson(cur)]>mx[rson(cur)])
	{
		mx[cur]=mx[lson(cur)],cnt[cur]=cnt[lson(cur)],md[cur]=max(md[lson(cur)],mx[rson(cur)]);
	}
	else
	{
		mx[cur]=mx[rson(cur)],cnt[cur]=cnt[rson(cur)],md[cur]=max(md[rson(cur)],mx[lson(cur)]);
	}
}
void pushdown(int cur)
{
	if(mx[lson(cur)]>mx[cur]&&md[lson(cur)]<mx[cur])
	{
		tag[lson(cur)]-=(mx[lson(cur)]-mx[cur])*cnt[lson(cur)];
		mx[lson(cur)]=mx[cur];
	}
	if(mx[rson(cur)]>mx[cur]&&md[rson(cur)]<mx[cur])
	{
		tag[rson(cur)]-=(mx[rson(cur)]-mx[cur])*cnt[rson(cur)];
		mx[rson(cur)]=mx[cur];
	}
}
void update(int cur, int lt, int rt, int qx, int qy, int val)
{
	if(mx[cur]<=val)return;
	if(lt>=qx&&rt<=qy&&md[cur]<val)
	{
		tag[cur]-=(mx[cur]-val)*cnt[cur];
		mx[cur]=val;
		return;
	}
	pushdown(cur);
	int mid=(lt+rt)>>1;
	if(qx<=mid)
	{
		update(lson(cur),lt,mid,qx,qy,val);
	}
	if(qy>mid)update(rson(cur),mid+1,rt,qx,qy,val);
	pushup(cur);
}
int query_maxi(int cur, int lt, int rt, int qx, int qy)
{
	if(qx>=lt&&rt<=qy)return mx[cur];
	pushdown(cur);
	int mid=(lt+rt)>>1, ans=0;
	if(qx<=mid)
	{
		ans=max(ans,query_maxi(lson(cur),lt,mid,qx,qy));
	}
	if(qy>mid)
	{
		ans=max(ans,query_maxi(rson(cur),mid+1,rt,qx,qy));
	}
	return ans;
}
int query_all(int cur, int lt, int rt, int qx, int qy)
{
	if(lt>=qx&&rt<=qy)return tag[cur];
	pushdown(cur);
	int mid=(lt+rt)>>1, ans=0;
	if(qx<=mid)
	{
		ans+=max(ans,query_maxi(lson(cur),lt,mid,qx,qy));
	}
	if(qy>mid)
	{
		ans+=max(ans,query_maxi(rson(cur),mid+1,rt,qx,qy));
	}
	return ans;
}
void build(int cur, int l, int r)
{
	if(l==r)
	{
		mx[cur]=tag[cur]=a[l],md[cur]=-1145141919810,cnt[cur]=1;
		return ;
	}
	int mid=(l+r)>>1;
	build(lson(cur),l,mid);
	build(rson(cur),mid+1,r);
	pushup(cur);
}

signed main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int t;
	for(cin>>t;t;t--)
	{
		cin>>n>>m;
		for(int i=1;i<=n;i++)cin>>a[i];
		build(1,1,n);
		while(m--)
		{
			int op, l, r;
			cin>>op>>l>>r;
			if(!op)
			{
				int x;
				cin>>x;
				update(1,1,n,l,r,x);
			}
			else if(op==1)
			{
				cout<<query_maxi(1,1,n,l,r)<<"\n";
			}
			else
			{
				cout<<query_all(1,1,n,l,r)<<"\n";
			}
		}
	}
}
2025/1/14 15:23
加载中...