社区讨论

奇怪,仅ACon#1,8,11,20,悬三关求调

P13978数列分块入门 3参与者 3已保存回复 6

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
6 条
当前快照
1 份
快照标识符
@mjhyuy8m
此快照首次捕获于
2025/12/23 10:29
2 个月前
此快照最后确认于
2025/12/25 20:25
2 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5;
inline int read(){
	int x=0,f=1;
	char c=getchar();
	while(c<'0' || c>'9'){
		if(c=='-')
			f=-1;
		c=getchar();
	}
	while(c>='0' && c<='9'){
		x=x*10+c-'0';
		c=getchar();
	}
	return x*f;
}
int n=read(),a[N],b[N],pos[N],l[N],r[N],add[N];
inline void update(int L,int R,int c){
	int p=pos[L],q=pos[R];
	if(p==q){
		for(int i=L;i<=R;i++)
			a[i]+=c;
		for(int i=l[p];i<=r[p];i++)
			b[i]=a[i];
		sort(b+l[p],b+r[p]+1);
	}
	else{
		for(int i=p+1;i<=q-1;i++)
			add[i]+=c;
		for(int i=L;i<=r[p];i++)
			a[i]+=c;
		for(int i=l[p];i<=r[p];i++)
			b[i]=a[i];
		sort(b+l[p],b+r[p]+1);
		for(int i=l[q];i<=R;i++)
			a[i]+=c;
		for(int i=l[q];i<=r[q];i++)
			b[i]=a[i];
		sort(b+l[q],b+r[q]+1);
	}
}
inline int query(int L,int R,int c){
	int p=pos[L],q=pos[R],ans=-LONG_LONG_MAX;
	if(p==q){
		for(int i=L;i<=R;i++)
			if(a[i]+add[p]<c && a[i]+add[p]>ans)
				ans=a[i]+add[p];
	}
	else{
		for(int i=L;i<=r[p];i++)
			if(a[i]+add[p]<c && a[i]+add[p]>ans)
				ans=a[i]+add[p];
		for(int i=l[q];i<=R;i++)
			if(a[i]+add[q]<c && a[i]+add[q]>ans)
				ans=a[i]+add[q];
		for(int i=p+1;i<=q-1;i++){
			int x=lower_bound(b+l[i],b+r[i]+1,c-add[i])-b-1;
			ans=max(ans,b[x]+add[i]);
		}
	}
	return ans;
}
signed main(){
	for(int i=1;i<=n;i++)
		a[i]=read(),b[i]=a[i];
	int t=sqrt(n);
	for(int i=1;i<=t;i++){
		l[i]=(i-1)*sqrt(n)+1;
		r[i]=i*sqrt(n);
		sort(b+l[i],b+r[i]+1);
	}
	if(r[t]<n){
		t++;
		l[t]=r[t-1]+1;
		r[t]=n;
		sort(b+l[t],b+r[t]+1);
	}
	for(int i=1;i<=t;i++)
		for(int j=l[i];j<=r[i];j++)
			pos[j]=i;
	for(int i=1;i<=n;i++){
		int op=read(),L=read(),R=read(),c=read();
		if(op==0)
			update(L,R,c);
		if(op==1){
			int ans=query(L,R,c);
			if(ans==-LONG_LONG_MAX)
				puts("-1");
			else
				printf("%lld\n",ans);
		}
	}
	return 0;
}

回复

6 条回复,欢迎继续交流。

正在加载回复...