社区讨论
样例能过,线段树全RE求调
P6327区间加区间 sin 和参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @m5njnx9a
- 此快照首次捕获于
- 2025/01/08 14:54 去年
- 此快照最后确认于
- 2025/01/08 20:48 去年
CPP
#include<bits/stdc++.h>
#define int long long
#define N 500005
#define ls (p<<1)
#define rs (p<<1|1)
using namespace std;
int n,m;
long double a[N];
struct tree{
int l,r;long double ssum,csum;int lz;
}tr[N*4];
void pls(int x,int y){
tree T=tr[x];
tr[x].ssum=T.ssum*cos(y)+T.csum*sin(y);
tr[x].csum=T.csum*cos(y)-T.ssum*sin(y);
}
void pushup(int p){
tr[p].ssum=tr[ls].ssum+tr[rs].ssum;
tr[p].csum=tr[ls].csum+tr[rs].csum;
}
void pushdown(int p){
if(tr[p].lz!=0){
pls(ls,tr[p].lz);
pls(rs,tr[p].lz);
tr[ls].lz+=tr[p].lz;
tr[rs].lz+=tr[p].lz;
pushup(p);
}
tr[p].lz=0;
}
void build(int p,int l,int r){
if(l==r){
tr[p]={l,r,sin(a[l]),cos(a[l]),0};
return;
}
tr[p].l=l;
tr[p].r=r;
int mid=(l+r)/2;
build(ls,l,mid);
build(rs,mid+1,r);
pushup(p);
}
void mod(int p,int l,int r,int lz){
if(tr[p].l>r||tr[p].r<l)return;
if(tr[p].l>=l&&tr[p].r<=r){
pls(p,lz);
tr[p].lz+=lz;
return;
}
pushdown(p);
mod(ls,l,r,lz);
mod(rs,l,r,lz);
pls(tr[ls].ssum,tr[rs].ssum);
pushup(p);
}
long double que(int p,int l,int r){
if(tr[p].l>r||tr[p].r<l) return 0;
if(tr[p].l>=l&&tr[p].r<=r)return tr[p].ssum;
pushdown(p);
return que(ls,l,r)+que(rs,l,r);
}
int l,r,v,f;
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1;i<=n;++i)cin>>a[i];
cin>>m;
build(1,1,n);
while(m--){
cin>>f>>l>>r;
if(f==1){
cin>>v;
mod(1,l,r,v);
}
else if(f==2)cout<<fixed<<setprecision(1)<<que(1,l,r)<<"\n";
}
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...