社区讨论
求调,样例过全WA
P6327区间加区间 sin 和参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mhjh0vav
- 此快照首次捕获于
- 2025/11/04 02:26 4 个月前
- 此快照最后确认于
- 2025/11/04 02:26 4 个月前
CPP
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n,m;
long long a[N],lz[N*4];
double sins[N*4],coss[N*4];
struct node{
int l;
int r;
};
node tree[N*4];
void update(int u,long long v){//和差角公式处理
double sinx=sin(v),cosx=cos(v);
double sina=sins[u],cosa=coss[u];
sins[u]=sina*cosx+cosa*sinx;
coss[u]=cosa*cosx-sina*sinx;
}
void pushdown(int u){
if(lz[u]){//消除懒标记
lz[u*2]+=lz[u];
lz[u*2+1]+=lz[u];
update(u*2,lz[u]);
update(u*2+1,lz[u]);
lz[u]=0;
}
}
void build(int u,int l,int r){
tree[u].l=l,tree[u].r=r;
if(l==r){
sins[u]=sin(a[l]);
coss[u]=cos(a[l]);
return ;
}
int mid=(l+r)>>1;
build(u*2,l,mid);
build(u*2+1,mid+1,r);
sins[u]=sins[u*2]+sins[u*2+1];
coss[u]=coss[u*2]+coss[u*2+1];
}
void add(int u,int l,int r,long long v){
if(l<=tree[u].l&&r>=tree[u].r){
update(u,v);
lz[u]+=v;
return ;
}
int mid=(tree[u].l+tree[u].r)>>1;
if(mid>=l) add(u*2,l,r,v);
if(mid<r) add(u*2+1,l,r,v);
sins[u]=sins[u*2]+sins[u*2+1];
coss[u]=coss[u*2]+coss[u*2+1];
}
double query(int u,int l,int r){
double sum=0;
if(l<=tree[u].l&&r>=tree[u].r)
return sins[u];
pushdown(u);
int mid=(tree[u].l+tree[u].r)>>1;
if(mid>=l) sum+=query(u*2,l,r);
if(mid<r) sum+=query(u*2+1,l,r);
return sum;
}
int main (){
cin >> n ;
for(int i=1;i<=n;i++) cin >> a[i];
build(1,1,n);
int op,x,y;
long long v;
cin >> m;
for(int i=1;i<=m;i++){
cin >> op >> x >> y ;
if(op==1){
cin >> v;
add(1,x,y,v);
}else
cout << fixed << setprecision(1) << query(1,x,y) << '\n';
}
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...