AC+TLE求助
查看原帖
AC+TLE求助
1254085
ZJ_lzz楼主2024/12/26 18:11
#include <bits/stdc++.h>
using namespace std;
long long n,a[1000005],b[1000005],m,f[4000005],d1[4000005],d2[4000005],d3[4000005],f1[4000005];
set<long long> l; 
map<long long,long long> p;
void galaxy1(long long x,long long l,long long r,long long v)
{
	if(v==-1)
	{
		return;
	}
	f[x]=f1[x]=v;
	d1[x]=v;
	d2[x]=d3[x]=0;
	return; 
}
void galaxy2(long long x,long long l,long long r,long long v)
{
	f[x]+=v;
	f1[x]+=v;
	d2[x]+=v;
	return;
}
void galaxy3(long long x,long long l,long long r,long long v)
{
	f[x]+=b[l]*v;
	f1[x]+=b[r]*v;
	d3[x]+=v;
	return;
}
void pushdown(long long x,long long l,long long r)
{
	long long lc=(x<<1),rc=(x<<1)|1,mid=(l+r)>>1;
	if(d1[x]!=-1)
	{
		galaxy1(lc,l,mid,d1[x]),galaxy1(rc,mid+1,r,d1[x]),d1[x]=-1;
	}
	if(d2[x]!=0)
	{
		galaxy2(lc,l,mid,d2[x]),galaxy2(rc,mid+1,r,d2[x]),d2[x]=0;
	}
	if(d3[x]!=0)
	{
		galaxy3(lc,l,mid,d3[x]),galaxy3(rc,mid+1,r,d3[x]),d3[x]=0;
	}
	return;
} 
void dijah1(long long x,long long l,long long r,long long ql,long long qr,long long v)
{
	if(ql<=l&&r<=qr)
	{
		galaxy1(x,l,r,v);
		return;
	}
	pushdown(x,l,r);
	long long lc=(x<<1),rc=(x<<1)|1,mid=(l+r)>>1;
	if(ql<=mid)
	{
	    dijah1(lc,l,mid,ql,qr,v);	
	}
	if(qr>mid)
	{
		dijah1(rc,mid+1,r,ql,qr,v);
	}
	f[x]=min(f[lc],f[rc]);
	f1[x]=max(f1[lc],f1[rc]); 
	return;
}
void dijah2(long long x,long long l,long long r,long long ql,long long qr,long long v)
{
	if(ql<=l&&r<=qr)
	{
		galaxy2(x,l,r,v);
		return; 
	}
	pushdown(x,l,r);
	long long lc=(x<<1),rc=(x<<1)|1,mid=(l+r)>>1;
	if(ql<=mid)
	{
		dijah2(lc,l,mid,ql,qr,v);
	}
	if(qr>mid)
	{
		dijah2(rc,mid+1,r,ql,qr,v);
	}
	f[x]=min(f[lc],f[rc]);
	f1[x]=max(f1[lc],f1[rc]); 
	return;
}
void dijah3(long long x,long long l,long long r,long long ql,long long qr,long long v)
{
	if(ql<=l&&r<=qr)
	{
		galaxy3(x,l,r,v);
		return; 
	}
	pushdown(x,l,r);
	long long lc=(x<<1),rc=(x<<1)|1,mid=(l+r)>>1;
	if(ql<=mid)
	{
		dijah3(lc,l,mid,ql,qr,v);
	}
	if(qr>mid)
	{
		dijah3(rc,mid+1,r,ql,qr,v);
	}
	f[x]=min(f[lc],f[rc]);
	f1[x]=max(f1[lc],f1[rc]); 
	return;
}
long long gaia1(long long x,long long l,long long r,long long ql,long long qr)
{
	if(ql<=l&&r<=qr)
	{
		return f[x];
	}
	pushdown(x,l,r);
	long long lc=(x<<1),rc=(x<<1)|1,mid=(l+r)>>1,h=1e15+5;
	if(ql<=mid)
	{
		h=gaia1(lc,l,mid,ql,qr);
	}
	if(qr>mid)
	{
		h=min(h,gaia1(rc,mid+1,r,ql,qr));
	}
	return h; 
}
long long gaia2(long long x,long long l,long long r,long long ql,long long qr,long long v)
{
	if(f[x]>=v)
	{
		return l;
	}
	if(l==r)
	{
		return -1;
	}
	long long lc=(x<<1),rc=(x<<1)|1,mid=(l+r)>>1,h;
	pushdown(x,l,r);
	if(qr<=mid)
	{
		return gaia2(lc,l,mid,ql,qr,v);
	}
	if(ql>mid)
	{
		return gaia2(rc,mid+1,r,ql,qr,v);
	}
	if(f[rc]<v)
	{
		return gaia2(rc,mid+1,r,ql,qr,v);
	}
	h=gaia2(lc,l,mid,ql,qr,v);
	if(h==-1)
	{
		return gaia2(rc,mid+1,r,ql,qr,v);
	}
	return h;
}
int main()
{
	long long x,y;
	memset(d1,-1,sizeof(d1));
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&a[i]),l.insert(a[i]);
	}
	long long g=0;
	set<long long>::iterator q=l.begin();
	for(;q!=l.end();q++)
	{
		p[*q]=++g;
		b[g]=*q;
	}
	for(int i=1;i<=n;i++)
	{
		a[i]=p[a[i]];
	}
	if(a[1]!=1)
	{
		dijah1(1,1,g,1,a[1]-1,m);
	}
	dijah3(1,1,g,a[1],g,1);
	dijah2(1,1,g,a[1],g,-b[a[1]]);
	for(int i=2;i<=n;i++)
	{
		y=gaia1(1,1,g,a[i-1],a[i-1]);
		if(a[i-1]!=1)
		{
			x=gaia2(1,1,g,1,a[i-1]-1,y);
			if(x!=-1)
			{
				dijah1(1,1,g,x,a[i-1]-1,y);
			}
		}
		if(a[i]!=1)
		{
			dijah2(1,1,g,1,a[i]-1,m);
		}
		dijah3(1,1,g,a[i],g,1);
		dijah2(1,1,g,a[i],g,-b[a[i]]);
	}
	printf("%lld",gaia1(1,1,g,1,g));
    return 0;
}
2024/12/26 18:11
加载中...