QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#187531#3850. DJ DarkoDaas#TL 3992ms15216kbC++142.6kb2023-09-24 17:57:112023-09-24 17:57:11

Judging History

你现在查看的是最新测评结果

  • [2023-09-24 17:57:11]
  • 评测
  • 测评结果:TL
  • 用时:3992ms
  • 内存:15216kb
  • [2023-09-24 17:57:11]
  • 提交

answer

#include<bits/stdc++.h>
#define N 200005
using namespace std;
const long long inf=1e18;
int n,Q,b[N],L[N],R[N],bl[N],Len,p[N];
long long a[N],tag[N],sum[N],sum1[N],bj[N];
int read() {
	int kkk=0,x=1;
	char c=getchar();
	while((c<'0' || c>'9') && c!='-') c=getchar();
	if(c=='-') c=getchar(),x=-1;
	while(c>='0' && c<='9') kkk=kkk*10+(c-'0'),c=getchar();
	return kkk*x;
}
void Down(int x) {
	if(bj[x]!=inf) {
		for(int l0=L[x],r0=R[x]; l0<=r0; ++l0)a[l0]=bj[x]+tag[x];
	} else if(tag[x]) {
		for(int l0=L[x],r0=R[x]; l0<=r0; ++l0)a[l0]+=tag[x];
	}
	tag[x]=0,bj[x]=inf;
}
bool cmp(int x,int y) {
	return a[x]<a[y];
}
void Update(int x) {
	sort(p+L[x],p+R[x]+1,cmp),sum1[L[x]]=b[p[L[x]]];
	for(int l0=L[x]+1,r0=R[x]; l0<=r0; ++l0)sum1[l0]=sum1[l0-1]+b[p[l0]];
	tag[x]=0,bj[x]=inf;
}
int Find(int l,int r,long long x) {
	int mid,ans=0;
	while(l<=r) {
		mid=(l+r)>>1;
		if(a[p[mid]]<=x)ans=mid,l=mid+1;
		else r=mid-1;
	}
	return ans;
}
bool Check(int l,int r,long long x) {
	long long ans=0;
	if(bl[l]==bl[r]) {
		Down(bl[l]);
		for(int i=l; i<=r; ++i)if(a[i]<=x)ans+=b[i];
	} else {
		Down(bl[l]),Down(bl[r]);
		for(int j=L[bl[r]]; j<=r; ++j)if(a[j]<=x)ans+=b[j];
		for(int j=R[bl[l]]; j>=l; --j)if(a[j]<=x)ans+=b[j];
		for(int j=bl[l]+1; j<bl[r]; ++j)
			if(bj[j]!=1e18) {
				if(bj[j]+tag[j]<=x)ans+=sum[R[j]]-sum[L[j]-1];
			} else ans+=sum1[Find(L[j],R[j],x-tag[j])];
	}
	return ans*2>=sum[r]-sum[l-1];
}
int main() {
	n=read(),Q=read(),Len=400;
	for(int i=1; i<=n; ++i)a[i]=read(),p[i]=i,bj[i]=inf;
	for(int i=1; i<=n; ++i)b[i]=read(),sum[i]=sum[i-1]+b[i];
	for(int i=1; i<=n; ++i) {
		R[bl[i]=i/Len+1]=i;
		if(!L[bl[i]])L[bl[i]]=i;
	}
	for(int i=1; i<=bl[n]; ++i)Update(i);
	for(int i=1,op,l,r,x; i<=Q; ++i) {
		op=read(),l=read(),r=read();
		if(op==1) {
			x=read();
			if(bl[l]==bl[r]) {
				Down(bl[l]);
				for(int j=l; j<=r; ++j)a[j]+=x;
				Update(bl[l]);
			} else {
				Down(bl[l]),Down(bl[r]);
				for(int j=L[bl[r]]; j<=r; ++j)a[j]+=x;
				for(int j=R[bl[l]]; j>=l; --j)a[j]+=x;
				Update(bl[l]),Update(bl[r]);
				for(int j=bl[l]+1; j<bl[r]; ++j)tag[j]+=x;
			}
		} else {
			long long ll=-2e14,rr=2e14,mid,ans;
			while(ll<=rr) {
				mid=ll+rr>>1;
				if(Check(l,r,mid))ans=mid,rr=mid-1;
				else ll=mid+1;
			}
			if(bl[l]==bl[r]) {
				Down(bl[l]);
				for(int j=l; j<=r; ++j)a[j]=ans;
				Update(bl[l]);
			} else {
				Down(bl[l]),Down(bl[r]);
				for(int j=L[bl[r]]; j<=r; ++j)a[j]=ans;
				for(int j=R[bl[l]]; j>=l; --j)a[j]=ans;
				Update(bl[l]),Update(bl[r]);
				for(int j=bl[l]+1; j<bl[r]; ++j)bj[j]=ans,tag[j]=0;
			}
			cout<<ans<<"\n";
		}
	}
	return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 3992ms
memory: 15032kb

input:

200000 200000
185413631 745038744 881479208 394948467 101727403 796960399 284541402 80768155 286582974 546327406 197495962 552359542 727479505 437895671 143092948 7626834 741609268 540494577 298656274 548860413 41137417 210529949 658779847 161355446 486548926 602900245 119414972 310187428 238177860 ...

output:

462406736
1749348519
1749348519
467651597
874061694
874061694
874061694
874061694
-1521749
874061694
-893932302
-425504259
-425504259
332034115
332034115
86195778
86195778
86195778
86195778
86195778
-425504259
-165776398
-165776398
-165776398
-916781043
-254293799
-254293799
-254293799
-254293799
-8...

result:

ok 100093 lines

Test #2:

score: 0
Accepted
time: 3955ms
memory: 15216kb

input:

200000 200000
972602488 314379868 184424413 693297170 700590031 777123666 30306102 166401429 402684895 653689101 215770359 161277184 972006312 379507241 52836126 481985240 481425913 456361236 149694150 336596790 22492952 154063153 414263227 854090461 603168307 194806250 934267524 8018143 119175379 8...

output:

459983042
459983042
459983042
459983042
459983042
459983042
459983042
459983042
459983042
459983042
459983042
1337072802
1189453446
1337072802
1189453446
1337072802
1189453446
1189453446
1189453446
1189453446
1189453446
1189453446
1189453446
1189453446
1189453446
1189453446
1189453446
1189453446
118...

result:

ok 100009 lines

Test #3:

score: -100
Time Limit Exceeded

input:

200000 200000
54451649 780255224 110478287 601059692 134896126 720758367 64302994 897948958 504280517 267611424 47310537 600352950 155295586 22375940 972388036 8479064 47904993 413885666 778337500 61878536 883229478 949122833 150124767 904785808 3877919 68702856 282619557 29644659 326058655 43935186...

output:

960711412
464459420
466826314
755354030
755354030
1576987719
653317168
755354030
653317168
653317168
653317168
755354030
755354030
755354030
755354030
755354030
755354030
949620275
949620275
949620275
1079046141
1201296119
1079046141
427993693
427993693
427993693
427993693
427993693
427993693
735104...

result: