社区讨论
分块优化线段树求调
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 条回复,欢迎继续交流。
正在加载回复...