QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#187518#3850. DJ DarkoSuiseiseki#TL 0ms0kbC++144.2kb2023-09-24 17:55:122023-09-24 17:55:12

Judging History

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

  • [2023-09-24 17:55:12]
  • 评测
  • 测评结果:TL
  • 用时:0ms
  • 内存:0kb
  • [2023-09-24 17:55:12]
  • 提交

answer

#include <cmath>
#include <vector>
#include <cstdio>
#include <algorithm>
typedef long long ll;
const int Maxn=200000;
const int Maxb=2000;
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];
int ord[Maxv+5][Maxb+5],b_len[Maxv+5];
std::pair<ll,ll> sum[Maxv+5][Maxb+5];
ll lazy[Maxv+5];
void init_build(int b){
	int bel_l=find_bel_l(b),bel_r=find_bel_r(b);
	b_len[b]=bel_r-bel_l+1;
	for(int i=bel_l;i<=bel_r;i++){
		ord[b][i-bel_l]=i;
	}
	std::sort(ord[b],ord[b]+bel_r-bel_l+1,[&](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;
	}
}
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);
	static int l_ord[Maxb+5],r_ord[Maxb+5];
	int pos_l=0,pos_r=0;
	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,l_ord+pos_l,r_ord,r_ord+pos_r,ord[b],[&](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;
	}
}
int cur_len;
int cur_ord[Maxb<<1|5];
std::pair<ll,ll> cur_sum[Maxb<<1|5];
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){
	int bel_l=find_belong(l),bel_r=find_belong(r);
	if(bel_l==bel_r){
		push_lazy(bel_l);
		cur_len=r-l+1;
		int pos=0;
		for(int j=0;j<b_len[bel_l];j++){
			int i=ord[bel_l][j];
			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);
	static int l_ord[Maxb+5],r_ord[Maxb+5];
	cur_len=l_r-l+1+r-r_l+1;
	int pos_l=0,pos_r=0;
	for(int j=0;j<b_len[bel_l];j++){
		int i=ord[bel_l][j];
		if(i>=l){
			l_ord[pos_l++]=i;
		}
	}
	for(int j=0;j<b_len[bel_r];j++){
		int i=ord[bel_r][j];
		if(i<=r){
			r_ord[pos_r++]=i;
		}
	}
	std::merge(l_ord,l_ord+pos_l,r_ord,r_ord+pos_r,cur_ord,[&](int p,int q){return a[p].first<a[q].first;});
	for(int i=0;i<cur_len;i++){
		cur_sum[i]=a[cur_ord[i]];
	}
	for(int i=1;i<cur_len;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,cur_sum+cur_len,std::make_pair(a,Inf_ll))-cur_sum;
	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++){
		int pos=std::upper_bound(sum[i],sum[i]+Maxb,std::make_pair(a-lazy[i],Inf_ll))-sum[i];
		ans+=(pos==0?0:sum[i][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:

462406736
1749348519
1825400336
467651597
1203850537
960500120
1547426790
724377526
713736203
964188422
-893932302
-7385440
534421341
628792184
410247671
525257073
524967019
386561322
805092443
505998243
-1297430136
181637713
549833468
-155945466
-256964932
9160240
41787442
32565247
379410404
-20250...

result: