求找RE原因(悬n关)
查看原帖
求找RE原因(悬n关)
1234924
lsd110504lsd楼主2025/6/14 15:17
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
#define int long long
int n,m;
const int N=1e6+520;
int tag[N],cl[N],cr[N],C[N],a[N];
//vector<int> v[N];
const int BLOCK=520;

int vsort[BLOCK][BLOCK];
int B_long[BLOCK];

char *p1,*p2,buf[100000];
#define nc() (p1==p2 && (p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
inline int read()
{
	int x=0,f=1;
	char ch=nc();
	while(ch<48||ch>57)
	{
		if(ch=='-')
			f=-1;
		ch=nc();
	}
	while(ch>=48&&ch<=57)
		x=x*10+ch-48,ch=nc();
	return x*f;
}
inline void write(int x)
{
	if(x<0)
		putchar('-'),x=-x;
	if(x>9)
		write(x/10);
	putchar(x%10+'0');
	return;
}
inline int check(int l,int r,int x,int k){
	int cnt=0;
	if(tag[l]==tag[r]){
		if(vsort[tag[l]][1]+C[tag[l]]>x)	return 0;
		for(int i=l;i<=r;i++){
			if(a[i]+C[tag[i]]<=x)	cnt++;
		}
	}
	else{
		for(int i=l;i<=cr[l];i++){
			if(vsort[tag[i]][1]+C[tag[i]]>x)	break;
			if(a[i]+C[tag[i]]<=x)	cnt++;
		}
		for(int i=cl[r];i<=r;i++){
			if(vsort[tag[i]][1]+C[tag[i]]>x)	break;
			if(a[i]+C[tag[i]]<=x)	cnt++;
		}
		for(int i=tag[l]+1;i<=tag[r]-1;i++){
			int _l=1,_r=B_long[i],tmp=0;
			if(vsort[i][1]+C[i]>x)	continue;
			while(_l<=_r){
				int mid=(_l+_r)>>1;
				if(vsort[i][mid]+C[i]<=x){
					tmp=mid;
					_l=mid+1;
				}
				else{
					_r=mid-1;
				}
			}
			cnt+=tmp;
		}
	} 
	return cnt;
}
inline void build(){
	int B=BLOCK;
	for(int k=1;k<=(n%B==0?n/B:n/B+1);k++){
		for(int i=(k-1)*B+1;i<=min(k*B,n);i++){
			tag[i]=k;
			cl[i]=(k-1)*B+1;
			cr[i]=min(n,k*B);
			vsort[k][i-((k-1)*B+1)+1]=a[i];
			B_long[k]++;
		}
		sort(vsort[k]+1,vsort[k]+B_long[k]+1);
	}
	return ;
}
inline void add(int l,int r,int k){
	if(tag[l]==tag[r]){
		for(int i=l;i<=r;i++)	a[i]+=k;
		for(int i=cl[l];i<=cr[l];i++){
			vsort[tag[i]][i-cl[l]+1]=a[i];
		}
		sort(vsort[tag[l]]+1,vsort[tag[l]]+1+B_long[tag[l]]);
	}
	else{
		for(int i=l;i<=cr[l];i++){
			a[i]+=k;
		}
		for(int i=cl[l];i<=cr[l];i++){
			vsort[tag[l]][i-cl[l]+1]=a[i];
		}
		sort(vsort[tag[l]]+1,vsort[tag[l]]+1+B_long[tag[l]]);
		for(int i=cl[r];i<=r;i++){
			a[i]+=k;
		}
		for(int i=cl[r];i<=cr[r];i++){
			vsort[tag[r]][i-cl[r]+1]=a[i];
		}
		sort(vsort[tag[r]]+1,vsort[tag[r]]+1+B_long[tag[r]]);
		for(int i=tag[l]+1;i<=tag[r]-1;i++){
			C[i]+=k;
		}
	}
	return ;
}
inline void query(int l,int r,int k){
	int ans=0;
	if(r-l+1<k){
		write(-1);
		printf("\n");
		return ;
	}
	if(tag[l]==tag[r]){
		int minx=1e9,maxx=-1e9;
		for(int i=l;i<=r;i++){
			minx=min(a[i]+C[tag[i]],minx);
			maxx=max(a[i]+C[tag[i]],maxx);
		}
		while(minx<=maxx){
			int mid=(minx+maxx)>>1;
			if(check(l,r,mid,k)>=k){
				ans=mid;
				maxx=mid-1;
			}
			else{
				minx=mid+1;
			}
		}
	}
	else{
		int minx=1e9,maxx=-1e9;
		for(int i=l;i<=cr[l];i++){
			minx=min(a[i]+C[tag[i]],minx);
			maxx=max(a[i]+C[tag[i]],maxx);
		}
		for(int i=cl[r];i<=r;i++){
			minx=min(a[i]+C[tag[i]],minx);
			maxx=max(a[i]+C[tag[i]],maxx);
		}
		for(int i=tag[l]+1;i<=tag[r]-1;i++){
			minx=min(vsort[i][1]+C[i],minx);
			maxx=max(maxx,vsort[i][B_long[i]]+C[i]);
		}
		while(minx<=maxx){
			int mid=(minx+maxx)>>1;
			if(check(l,r,mid,k)>=k){
				ans=mid;
				maxx=mid-1;
			}
			else{
				minx=mid+1;
			}
		}
	}
	write(ans);
	printf("\n");
	return ;
}
signed main(){
	//freopen("Ynoi.in","r",stdin);
	//freopen("zhengjie.out","w",stdout);
	n=read(),m=read();
	for(int i=1;i<=n;i++)	a[i]=read();
	build();
	for(int i=1;i<=m;i++){
		int opt=read(),l=read(),r=read(),k=read();
		if(opt&1){
			query(l,r,k);
		}
		else{
			add(l,r,k);
		}
	} 
	return 0;
}

$

2025/6/14 15:17
加载中...