社区讨论

分块优化线段树求调

P1001A+B Problem参与者 8已保存回复 12

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
11 条
当前快照
1 份
快照标识符
@mjqvw27d
此快照首次捕获于
2025/12/29 16:15
2 个月前
此快照最后确认于
2025/12/29 17:08
2 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
#define n 1e6
using namespace std;
int a,b,lena,lenb;
int tr[4000010],tg[4000010];
void psu(int ro){tr[ro]=tr[ro*2]+tr[ro*2+1];}
void psd(int ro,int len){
	tr[ro*2]+=tg[ro]*((len+1)/2);
	tr[ro*2+1]+=tg[ro]*(len/2);
	tg[ro*2]+=tg[ro];
	tg[ro*2+1]+=tg[ro];
	tg[ro]=0;
}
void upd1(int l,int r,int ro,int lt,int rt,int c){
	if(r<lt||l>rt)return;
	if(l>=lt&&r<=rt){
		tr[ro]+=c;
		tg[ro]+=c;
		return;
	}
	psd(ro,r-l+1);
	int mid=(l+r)/2;
	upd1(l,mid,ro*2,lt,rt,c);
	upd1(mid+1,r,ro*2+1,lt,rt,c);
	psu(ro);
}
void upd2(int l,int r,int ro,int x,int c){
	if(r<x||l>x)return;
	if(l==x&&r==x){
		tr[ro]+=c;
		return;
	}
	psd(ro,r-l+1);
	int mid=(l+r)/2;
	upd2(l,mid,ro*2,x,c);
	upd2(mid+1,r,ro*2+1,x,c);
	psu(ro);
}
int qry(int l,int r,int ro,int lt,int rt){
	if(r<lt||l>rt)return 0;
	if(l>=lt||r<=rt)return tr[ro];
	psd(ro,r-l+1);
	int mid=(l+r)/2,s=0;
	s+=qry(l,mid,ro*2,lt,rt);
	s+=qry(mid+1,r,ro*2+1,lt,rt);
	psu(ro);
	return s;
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>a>>b;
    bool fa=a<0,fb=b<0;
	lena=sqrt(a),lenb=sqrt(b);
	if(fa)upd1(1,n,1,1,lena,-lena);
    else upd1(1,n,1,1,lena,lena);
	if(fa)upd2(1,n,1,lena+1,-a+lena*lena);
    else upd2(1,n,1,lena+1,a-lena*lena);
	if(fb)upd1(1,n,1,lena+2,lena+1+lenb,-lenb);
    else upd1(1,n,1,lena+2,lena+1+lenb,lenb);
	if(fb)upd2(1,n,1,lena+2+lenb,-b+lenb*lenb);
    else upd2(1,n,1,lena+2+lenb,b-lenb*lenb);
	cout<<qry(1,n,1,1,lena+lenb+2);
	return 0;
}

回复

12 条回复,欢迎继续交流。

正在加载回复...