QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#187333#3850. DJ DarkoSuiseiseki#TL 0ms0kbC++144.4kb2023-09-24 16:27:482023-09-24 16:27:48

Judging History

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

  • [2023-09-24 16:27:48]
  • 评测
  • 测评结果:TL
  • 用时:0ms
  • 内存:0kb
  • [2023-09-24 16:27:48]
  • 提交

answer

#include <cmath>
#include <vector>
#include <cstdio>
#include <algorithm>
typedef long long ll;
const int Maxn=200000;
const int Maxb=4000;
const int Maxv=(Maxn-1)/Maxb+1;
const ll Inf_ll=200000000000000ll;
int find_belong(int x){
	return (x-1)/Maxb+1;
}
int find_bel_l(int x){
	return (x-1)*Maxb+1;
}
int n,q;
int find_bel_r(int x){
	return std::min(n,x*Maxb);
}
std::pair<ll,ll> a[Maxn+5];
std::vector<int> ord[Maxv+5];
std::vector<std::pair<ll,ll> > sum[Maxv+5];
ll lazy[Maxv+5];
void init_build(int b){
	int bel_l=find_bel_l(b),bel_r=find_bel_r(b);
	ord[b].resize(bel_r-bel_l+1);
	for(int i=bel_l;i<=bel_r;i++){
		ord[b][i-bel_l]=i;
	}
	std::sort(ord[b].begin(),ord[b].end(),[&](int p,int q){return a[p].first<a[q].first;});
	sum[b].resize(bel_r-bel_l+1);
	for(int i=0;i<bel_r-bel_l+1;i++){
		sum[b][i]=a[ord[b][i]];
	}
	for(int i=1;i<bel_r-bel_l+1;i++){
		sum[b][i].second+=sum[b][i-1].second;
	}
}
void rebuild(int b,int l,int r,int v){
	int bel_l=find_bel_l(b),bel_r=find_bel_r(b);
	l=std::max(l,bel_l),r=std::min(r,bel_r);
	std::vector<int> l_ord,r_ord;
	int pos_l=0,pos_r=0;
	l_ord.resize(bel_r-bel_l+1-(r-l+1)),r_ord.resize(r-l+1);
	for(int i:ord[b]){
		if(l<=i&&i<=r){
			r_ord[pos_r++]=i;
		}
		else{
			l_ord[pos_l++]=i;
		}
	}
	for(int i=l;i<=r;i++){
		a[i].first+=v;
	}
	std::merge(l_ord.begin(),l_ord.end(),r_ord.begin(),r_ord.end(),ord[b].begin(),[&](int p,int q){return a[p].first<a[q].first;});
	for(int i=0;i<bel_r-bel_l+1;i++){
		sum[b][i]=a[ord[b][i]];
	}
	for(int i=1;i<bel_r-bel_l+1;i++){
		sum[b][i].second+=sum[b][i-1].second;
	}
}
std::vector<int> cur_ord;
std::vector<std::pair<ll,ll> > cur_sum;
void push_lazy(int b){
	int bel_l=find_bel_l(b),bel_r=find_bel_r(b);
	for(int i=bel_l;i<=bel_r;i++){
		a[i].first+=lazy[b];
	}
	for(std::pair<ll,ll> &i:sum[b]){
		i.first+=lazy[b];
	}
	lazy[b]=0;
}
void get_new(int l,int r){
	cur_ord.clear(),cur_sum.clear();
	int bel_l=find_belong(l),bel_r=find_belong(r);
	if(bel_l==bel_r){
		push_lazy(bel_l);
		cur_ord.resize(r-l+1),cur_sum.resize(r-l+1);
		int pos=0;
		for(int i:ord[bel_l]){
			if(l<=i&&i<=r){
				cur_ord[pos++]=i;
			}
		}
		for(int i=0;i<r-l+1;i++){
			cur_sum[i]=a[cur_ord[i]];
		}
		for(int i=1;i<r-l+1;i++){
			cur_sum[i].second+=cur_sum[i-1].second;
		}
		return;
	}
	push_lazy(bel_l),push_lazy(bel_r);
	int l_r=find_bel_r(bel_l),r_l=find_bel_l(bel_r);
	std::vector<int> l_ord,r_ord;
	l_ord.resize(l_r-l+1),r_ord.resize(r-r_l+1);
	cur_ord.resize(l_ord.size()+r_ord.size());
	int pos_l=0,pos_r=0;
	for(int i:ord[bel_l]){
		if(i>=l){
			l_ord[pos_l++]=i;
		}
	}
	for(int i:ord[bel_r]){
		if(i<=r){
			r_ord[pos_r++]=i;
		}
	}
	std::merge(l_ord.begin(),l_ord.end(),r_ord.begin(),r_ord.end(),cur_ord.begin(),[&](int p,int q){return a[p].first<a[q].first;});
	cur_sum.resize(cur_ord.size());
	for(int i=0;i<(int)cur_ord.size();i++){
		cur_sum[i]=a[cur_ord[i]];
	}
	for(int i=1;i<(int)cur_ord.size();i++){
		cur_sum[i].second+=cur_sum[i-1].second;
	}
}
ll query_sum(int l,int r,ll a){
	int pos=std::upper_bound(cur_sum.begin(),cur_sum.end(),std::make_pair(a,Inf_ll))-cur_sum.begin();
	ll ans=(pos==0?0:cur_sum[pos-1].second);
	int bel_l=find_belong(l),bel_r=find_belong(r);
	if(bel_l==bel_r){
		return ans;
	}
	for(int i=bel_l+1;i<bel_r;i++){
		pos=std::upper_bound(sum[i].begin(),sum[i].end(),std::make_pair(a-lazy[i],Inf_ll))-sum[i].begin();
		ans+=(pos==0?0:cur_sum[pos-1].second);
	}
	return ans;
}
ll sum_b[Maxn+5];
ll query(int l,int r){
	get_new(l,r);
	ll cur_all=sum_b[r]-sum_b[l-1];
	ll left=-Inf_ll,right=Inf_ll;
	while(left<right){
		ll mid=floor((left+right)/2.0l);
		if(query_sum(l,r,mid)>=cur_all/2){
			right=mid;
		}
		else{
			left=mid+1;
		}
	}
	return left;
}
void modify(int l,int r,int a){
	int bel_l=find_belong(l),bel_r=find_belong(r);
	if(bel_l==bel_r){
		rebuild(bel_l,l,r,a);
		return;
	}
	rebuild(bel_l,l,r,a),rebuild(bel_r,l,r,a);
	for(int i=bel_l+1;i<bel_r;i++){
		lazy[i]+=a;
	}
}
int main(){
	scanf("%d%d",&n,&q);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i].first);
	}
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i].second);
	}
	for(int i=1;i<=n;i++){
		sum_b[i]=sum_b[i-1]+a[i].second;
	}
	for(int i=1;i<=find_belong(n);i++){
		init_build(i);
	}
	for(int i=1;i<=q;i++){
		int op,l,r;
		scanf("%d%d%d",&op,&l,&r);
		if(op==1){
			int x;
			scanf("%d",&x);
			modify(l,r,x);
		}
		else{
			printf("%lld\n",query(l,r));
		}
	}
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Time Limit Exceeded

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:

200000000000000
1740533035
1817371037
459114294
1200015974
959052673
1550830326
724830797
720225971
965589536
-887149548
-11083534
526278277
624791682
410276618
534293049
520793834
368244608
793150931
496994987
-1299519110
176857224
546754298
-171132361
-262224698
-9535539
57084511
46831742
38382837...

result: