为啥调块大小会导致WA
查看原帖
为啥调块大小会导致WA
208967
Hasinon楼主2021/11/10 14:38

block=233\300就没问题
其他比如400,500就有问题
为啥啊?

#include<bits/stdc++.h>
#define ll long long
#define pb push_back
#define mid ((el+er)>>1)
#define FOR(i,a,b) for(int i=(a); i<=(b); ++i)
#define ROF(i,a,b) for(int i=(a); i>=(b); --i)
using namespace std;
bool happy1041;
ll time1=clock();
//
const ll N=1e5,block=903;
ll a[N+10],kto;
ll kl[N/block+10],kr[N/block+10],klz[N/block+10],ka[N+10],gba[N/block+10],gbb[N/block+10];
//
inline char gc(){
	static char buf[100000],*p1=buf,*p2=buf;
	return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline ll gt(){
	ll t=0,f=0;char v=getchar();
	while(!isdigit(v)) f|=(v=='-'),v=getchar();
	while(isdigit(v)) t=(t<<3)+(t<<1)+(v^48),v=getchar();
	return f?-t:t;
}
inline void wr(ll x){
	if(x>9) wr(x/10);
	putchar(x%10+'0');
	return;
}
void msort(ll ord,ll l,ll r,ll k){
	ll g1=0,g2=0,to=kr[ord];
	FOR(i,kl[ord],kr[ord]){
		if(l<=ka[i]&&ka[i]<=r){
			gba[++g1]=ka[i]; a[ka[i]]+=k;
		} 
		else gbb[++g2]=ka[i];
	}
	while(g1&&g2) ka[to--]=(a[gba[g1]]>a[gbb[g2]])?gba[g1--]:gbb[g2--];
	while(g1) ka[to--]=gba[g1--];
	while(g2) ka[to--]=gbb[g2--];
}
bool cmp(ll x,ll y){
	return a[x]<a[y];
}
bool Happy1041;
void usage() {
	ll time2=clock();
	cout<<(&Happy1041-&happy1041)/1024/1024<<" Mb, "<<time2-time1<<" Ms\n";
}
int main() {
//	freopen("poker.in","r",stdin);
//	freopen("poker.out","w",stdout);
	ll n=gt(),m=gt();
	FOR(i,1,n) a[i]=gt(); ll kto=(n-1)/block+1; 
	FOR(i,1,kto) kl[i]=kr[i-1]+1,kr[i]=kr[i-1]+block; 
	kr[kto]=n; kl[kto+1]=n+1; kr[0]=0;
	FOR(i,1,kto){
		FOR(j,kl[i],kr[i]) ka[j]=j;
		sort(ka+kl[i],ka+kr[i]+1,cmp);
	}
	FOR(i,1,m){
		ll opt=gt(),l=gt(),r=gt(),k=gt();
		if(opt==2){
			ll st=lower_bound(kl+1,kl+kto+1,l)-kl,en=upper_bound(kr+1,kr+kto+1,r)-kr-1;
//			printf("%lld %lld %lld %lld\n",st,en,kl[st],kr[en]);
			if(st>en+1) msort(en+1,l,r,k);
			else{
				FOR(j,st,en) klz[j]+=k;
//				printf("%lld %lld\n",l,kr[st-1]);
				msort(st-1,l,kr[st-1],k);
//				printf("%lld %lld\n",kl[en+1],r);
				msort(en+1,kl[en+1],r,k);
			}
		}
		else{
			ll el=-2e4*i,er=2e4*i,st=lower_bound(kl+1,kl+kto+1,l)-kl,en=upper_bound(kr+1,kr+kto+1,r)-kr-1;
			if(r-l+1<k){
				printf("-1\n"); continue;
			}
//			printf("%lld %lld %lld %lld\n",st,en,kl[st],kr[en]);
			while(el<er){
//				printf("%lld %lld\n",el,er);
				ll tot=0;
				if(st>en+1){
					FOR(j,l,r)
						if(a[j]+klz[st-1]<=mid) ++tot;
//					printf("%lld\n",tot);
				}
				else{
					FOR(j,l,kl[st]-1)
						if(a[j]+klz[st-1]<=mid) ++tot;
//					printf("%lld\n",tot);
					FOR(j,kr[en]+1,r)
						if(a[j]+klz[en+1]<=mid) ++tot;
//					printf("%lld\n",tot);
					FOR(j,st,en){
						ll tl=kl[j],tr=kr[j]+1;
						while(tl<tr){
//							printf("%lld %lld\n",tl,tr);
							ll mmid=(tl+tr)>>1;
							(a[ka[mmid]]+klz[j]>mid)?tr=mmid:tl=mmid+1;
						}	
						tot+=tl-kl[j];
					}
//					printf("%lld\n",tot);
				}
				(tot>=k)?er=mid:el=mid+1;
			}
			printf("%lld\n",el);
		}
//		FOR(j,1,n) printf("%lld ",a[ka[j]]); printf("\n");
//		FOR(j,1,kto) printf("%lld ",klz[j]); printf("\n");
	}
}
2021/11/10 14:38
加载中...