全部tle求大佬调
查看原帖
全部tle求大佬调
538376
yuyudong楼主2024/7/19 11:42
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=10000010;
ll a[maxn],t[maxn],belong[maxn],st[maxn],ed[maxn],siz[maxn],tag[maxn];
ll n,m,block=150,len;
ll read(){
   ll s = 0,w = 1;
   char ch = getchar();
   while(ch < '0' || ch > '9'){if(ch == '-')w = -1;ch = getchar();}
   while(ch >= '0' && ch <= '9')s = s * 10 + ch - '0',ch = getchar();
   return s * w;
}
void init()
{
	block=150;
	len = ceil(n * 1.0 / block);
	for(ll i=1;i<=len;i++)
	{
		st[i]=(i-1)*len+1;
		ed[i]=i*len;
		siz[i]=ed[i]-st[i]+1;
	}
	ed[len]=n;
	for(ll i=1;i<=len;i++)
	{
		for(ll j=st[i];j<=ed[i];j++)
		{
			belong[j]=i;
		}
		sort(t+st[i],t+ed[i]+1);
	}
}
ll check(ll l,ll r,ll w)
{
	ll x=belong[l],y=belong[r];
	ll cnt=0;
	if(x==y)
	{
		for(ll i=l;i<=r;i++)
		{
			if(a[i]+tag[x]<=w) cnt++;
		}
		return cnt;
	}
	for(ll i=l;i<=ed[x];i++)
	{
		if(a[i]+tag[x]<=w) cnt++;
	}
	for(ll i=st[y];i<=r;i++)
	{
		if(a[i]+tag[x]<=w) cnt++;
	}
	for(ll i=x+1;x<y;i++)
	{
		if(t[st[i]]+tag[i]>w) continue;
		if(t[ed[i]]+tag[i]<=w) 
		{
			cnt+=ed[i]-st[i]+1;
			continue;
		}
		ll L=st[i],rr=ed[i];
		while(L<rr)
		{
			ll mid=L+rr>>1+1;
			if(t[L]+tag[i]<=w) L=mid;
			else rr=mid-1;
		}
		if(t[L]+tag[i]<=w)	cnt+=L-st[i]+1;
	}
	return cnt;
}
ll getmax(ll l,ll r)
{
	ll x=belong[l],y=belong[r];
	ll ans=-100000000;
	if(x==y)
	{
		for(ll i=l;i<=r;i++){
			ans=max(ans,a[i]+tag[x]);
		}
		return ans;
	}
	for(ll i=l;i<=ed[x];i++)
	{
		ans=max(ans,a[i]+tag[x]);
	}
	for(ll i=st[y];i<=r;i++){
		ans=max(ans,a[i]+tag[y]); 
	}
	for(ll i=x+1;i<y;i++){
		ans=max(ans,t[ed[i]]+tag[i]);
	}return ans;
}
ll getmin(ll l,ll r)
{
	ll x=belong[l],y=belong[r];
	ll ans=maxn<<1;
	if(x==y)
	{
		for(ll i=l;i<=r;i++){
			ans=min(ans,a[i]+tag[x]);
		}
		return ans;
	}
	for(ll i=l;i<=ed[x];i++)
	{
		ans=min(ans,a[i]+tag[x]);
	}
	for(ll i=st[y];i<=r;i++){
		ans=min(ans,a[i]+tag[y]); 
	}
	for(ll i=x+1;i<y;i++){
		ans=min(ans,t[st[i]]+tag[i]);
	}return ans;
}
void change(ll l,ll r,ll k)
{
	ll x=belong[l],y=belong[r];
	if(x==y)
	{
		for(ll i=l;i<=r;i++){
			a[i]+=k;
		}
		for(ll i=st[x];i<=ed[x];i++){
			t[i]=a[i];
		}
		sort(t+st[x],t+ed[x]+1);
		return;
	}
	for(ll i=l;i<=ed[x];i++){
		a[i]+=k;
	}for(ll i=st[y];i<=r;i++){
		a[i]+=k; 
	}for(ll i=x+1;i<y;i++){
		tag[i]+=k;
	}for(ll i=st[x];i<=ed[x];i++) t[i]=a[i];
	sort(t+st[x],t+ed[x]+1);
	for(ll i=st[y];i<=ed[y];i++) t[i]=a[i];
	sort(t+st[y],t+ed[y]+1);
}
ll query(ll x,ll y,ll k)
{
	if(k<1||k>y-x+1) return -1;
	ll l,r,mid;
	ll ans=-1;
	l=getmin(x,y);
	r=getmax(x,y);
	while(l<=r)
	{
		ll mid=l+r>>1;
		if(check(x,y,mid)<k) l=mid+1;
		else 
		{
			r=mid-1;
			ans=mid;
		}
	}
	return ans;
}
int main()
{
	scanf("%lld%lld",&n,&m);
	for(ll i=1;i<=n;i++)
	{
		a[i]=read();
		t[i]=a[i];
	}
	init();
	for(ll i=1;i<=m;i++)
	{
		ll tmp,l,r,k;
		tmp=read();
		l=read();
		r=read();
		k=read();
		if(tmp==1)
		{
			printf("%lld",query(l,r,k));
		}
		else 
		{
			change(l,r,k);
		}
	}
	return 0;
}
2024/7/19 11:42
加载中...