subtask第二个点一直wa,怎么回事
查看原帖
subtask第二个点一直wa,怎么回事
744789
Big_Bishop楼主2024/8/1 13:25
#include<cstdio>
#include<cmath>
#include<algorithm>
#define lol long long
using namespace std;
int read(){
	int p=0,w=1;char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-') w=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9') p=(p<<1)+(p<<3)+ch-'0',ch=getchar();
	return p;
}
const int N=1e5+5;
int n,id[N],m,ll[320],rr[320],len;
lol a[N],tag[320],b[N];
void add(int l,int r,lol v){
	if(id[l]==id[r]){
		for(int i=l;i<=r;i++) a[i]+=v;
		for(int i=ll[id[l]];i<=rr[id[l]];i++) b[i]=a[i];
		sort(b+ll[id[l]],b+rr[id[l]]+1);
	}
	else{
		for(int i=l;i<=rr[id[l]];i++) a[i]+=v;
		for(int i=ll[id[r]];i<=r;i++) a[i]+=v;
		for(int i=ll[id[l]];i<=rr[id[l]];i++) b[i]=a[i];
		for(int i=ll[id[r]];i<=rr[id[r]];i++) b[i]=a[i];
		sort(b+ll[id[l]],b+rr[id[l]]+1);
		sort(b+ll[id[r]],b+rr[id[r]]+1);
		for(int i=id[l]+1;i<id[r];i++) tag[i]+=v;
	}
}
lol get_max(int l,int r){
	lol mx=-1e18;
	if(id[l]==id[r]){
		for(int i=l;i<=r;i++) mx=max(mx,a[i]+tag[id[l]]); 
	}
	else{
		for(int i=l;i<=rr[id[l]];i++) mx=max(mx,a[i]+tag[id[i]]);
		for(int i=ll[id[r]];i<=r;i++) mx=max(mx,a[i]+tag[id[i]]);
		for(int i=id[l]+1;i<id[r];i++) mx=max(mx,b[rr[i]]+tag[i]);
	}
	return mx;
} 
lol get_min(int l,int r){
	lol mi=1e18;
	if(id[l]==id[r]){
		for(int i=l;i<=r;i++) mi=min(mi,a[i]+tag[id[l]]); 
	}
	else{
		for(int i=l;i<=rr[id[l]];i++) mi=min(mi,a[i]+tag[id[i]]);
		for(int i=ll[id[r]];i<=r;i++) mi=min(mi,a[i]+tag[id[i]]);
		for(int i=id[l]+1;i<id[r];i++) mi=min(mi,b[ll[i]]+tag[i]);
	}
	return mi;
}
int solve(int x,lol v){
	if(v>=b[rr[x]]+tag[x]) return rr[x]-ll[x]+1;
	if(v<b[ll[x]]+tag[x]) return 0;
	int l=1,r=rr[x]-ll[x]+1,ans=0;
	while(l<=r){
		int mid=l+r>>1;
		if(b[mid+ll[x]-1]+tag[x]<=v) ans=mid,l=mid+1;
		else r=mid-1;
	}
	return ans;
}
int get(int l,int r,lol v){
	int cnt=0;
	if(id[l]==id[r]){
		for(int i=l;i<=r;i++) if(a[i]+tag[id[i]]<=v) cnt++;
	}
	else{
		for(int i=l;i<=rr[id[l]];i++) if(a[i]+tag[id[i]]<=v) cnt++;
		for(int i=ll[id[r]];i<=r;i++) if(a[i]+tag[id[i]]<=v) cnt++;
		for(int i=id[l]+1;i<id[r];i++) cnt+=solve(i,v);
	}
	return cnt;
}
lol query(int o,int p,int v){
	if(v<1||p-o+1<v) return -1;
	if(v==1) return get_min(o,p);
	if(v==p-o+1) return get_max(o,p);
	lol l=get_min(o,p);
	lol r=get_max(o,p);
	lol ans=-1;
	while(l<=r){
		lol mid=(l+r)/2;
		if(get(o,p,mid)>=v) ans=mid,r=mid-1;
		else l=mid+1;
	}
	return ans;
}
int main(){
	n=read(),m=read();
	len=sqrt(n);
	for(int i=1;i<=n;i++){
		a[i]=read();
		b[i]=a[i];
		id[i]=i%len==0?i/len:i/len+1;
		if(i%len==0) rr[id[i]]=i;
		if(i%len==1) ll[id[i]]=i;
	}
	rr[id[n]]=n;
	if(len==1){
		for(int i=1;i<=id[n];i++) ll[i]=rr[i]=i;
	}
	for(int i=1;i<=id[n];i++) sort(b+ll[i],b+rr[i]+1);
	while(m--){
		lol op=read(),l=read(),r=read(),k=read();
		if(op==1) printf("%lld\n",query(l,r,k));
		else add(l,r,k);
	}
	return 0;
}
2024/8/1 13:25
加载中...