萌新WA0分求调
查看原帖
萌新WA0分求调
498526
htssm楼主2022/3/10 14:12

这题调了好久还是没过啊,求助/kk

#include<bits/stdc++.h>
#define int long long
#define hor(i,l,r) for(register int i=l;i<=r;i++)
#define lor(i,l,r) for(register int i=l;i>=r;i--)
#define un unsigned
#define fr front
#define se second
#define fi first
#define pb push_back
using namespace std;
template<typename T> inline void read(T &x){
	x=0;char c=getchar();bool flag=false;
	while(!isdigit(c)){if(c=='-')flag=true;c=getchar();}
	while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
	if(flag)x=-x;
}
template<typename T> inline void write(T x){
   	short st[30],tp=0;
	if(x<0) putchar('-'),x=-x;
	do st[++tp]=x%10,x/=10; while(x);
	while(tp) putchar('0'|st[tp--]);
}
#define wr write
#define rd read
#define pk putchar(' ')
#define ed puts("")
const int N=1e5+10;
int tag[N],a[N],bls[N],n,q,tot,ls[N],rs[N],b[N],ql,qr,qk,opt,bl=150;
void res(int x){
	hor(i,ls[x],rs[x]) b[i]=a[i];
	sort(b+ls[x],b+rs[x]+1);
}
void add(int l,int r,int x){
	if(bls[l]==bls[r]){
		hor(i,l,r) a[i]+=x;
		res(bls[l]);
		return;
	}
	hor(i,l,rs[bls[l]]) a[i]+=x;
	res(bls[l]);
	hor(i,ls[bls[r]],r) a[i]+=x;
	res(bls[r]);
	for(int i=bls[l]+1;i<bls[r];i++) tag[i]+=x;
}
int lbw(int l,int r,int k){
	int ans=0;
	if(bls[l]==bls[r]){
		hor(i,l,r) if((a[i]+tag[bls[i]])<=k) ans++;
		return ans;
	}
	hor(i,l,rs[bls[l]]) if((a[i]+tag[bls[l]])<=k) ans++;
	hor(i,ls[bls[r]],r) if((a[i]+tag[bls[l]])<=k) ans++;
	for(int i=bls[l]+1;i<bls[r];i++){
		int ll=ls[i],rr=rs[i];
		if((b[ll]+tag[i])<k) continue;
		if((b[rr]+tag[i])<=k){
			ans+=(rr-ll+1);
			continue;
		}
		while(ll<rr){
			int mid=((ll+rr)>>1)+1;
			if(b[mid]+tag[i]<=k) rr=mid;
			else rr=mid-1;
		}
		if((b[ls[i]]+tag[i])<=k) ans+=(ll-ls[i]+1);
	}
	return ans;
}
void getjv(int l,int r,int &minn,int &maxn){
	if(bls[l]==bls[r]){
		hor(i,l,r) minn=min(minn,(a[i]+tag[bls[i]])),maxn=max(maxn,(a[i]+tag[bls[i]]));
		return;
	}
	hor(i,l,rs[bls[l]]) minn=min(minn,(a[i]+tag[bls[i]])),maxn=max(maxn,(a[i]+tag[bls[i]]));
	hor(i,ls[bls[r]],r) minn=min(minn,(a[i]+tag[bls[i]])),maxn=max(maxn,(a[i]+tag[bls[i]]));
	for(int i=bls[l]+1;i<bls[r];i++) minn=min(minn,(b[ls[i]]+tag[i])),maxn=max(maxn,(b[rs[i]]+tag[i]));
}
int query(int l,int r,int k){
	if(k<1||k>(r-l+1)) return -1;
	int minn=0x7fffffffffffffff,maxn=-0x7fffffffffffffff,ans=-1;
	getjv(l,r,minn,maxn);
	if(k==1) return minn;
	if(k==(r-l+1)) return maxn;
	while(minn<=maxn){
		int mid=(minn+maxn)/2;
		if(lbw(l,r,mid)<k) minn=mid+1;
		else maxn=mid-1,ans=mid;
	}
	return ans;
}
signed main(){
	rd(n),rd(q);
	hor(i,1,n) rd(a[i]);
	tot=n/bl;
	if(n%bl!=0) tot++;
	hor(i,1,tot) ls[i]=(i-1)*bl+1,rs[i]=i*bl;
	rs[tot]=n;
	hor(i,1,n) bls[i]=(i-1)/bl,b[i]=a[i];
	hor(i,1,tot) sort(b+ls[i],b+rs[i]+1);
	while(q--){
		rd(opt),rd(ql),rd(qr),rd(qk);
		if(opt==2) add(ql,qr,qk);
		else wr(query(ql,qr,qk)),ed;
	}
}
2022/3/10 14:12
加载中...