社区讨论
蒟蒻刚学oi,wa0pts求条
P6327区间加区间 sin 和参与者 3已保存回复 9
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 8 条
- 当前快照
- 1 份
- 快照标识符
- @mjbdut66
- 此快照首次捕获于
- 2025/12/18 19:54 2 个月前
- 此快照最后确认于
- 2025/12/18 20:42 2 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
long long n,m,a[N];
struct nd {
double s,c;
long long tg;
} t[N << 2];
void pu(int u) {
t[u].s=t[u << 1].s+t[u << 1 | 1].s;
t[u].c=t[u << 1].c+t[u << 1 | 1].c;
}
void pd(int u) {
if(!t[u].tg) return;
int v=t[u].tg;
t[u << 1].tg+=v;
double ts=t[u << 1].s,tc=t[u << 1].c;
t[u<<1].s=ts*cos(v)+tc*sin(v);
t[u<<1].c=tc*cos(v)-ts*sin(v);
t[u << 1 | 1].tg+=v;
ts=t[u << 1 | 1].s,tc=t[u << 1|1].c;
t[u << 1 | 1].s=ts*cos(v)+tc*sin(v);
t[u << 1 | 1].c=tc*cos(v)-ts*sin(v);
t[u].tg=0;
}
void build(int u,int l,int r) {
t[u].tg=0;
if(l==r) {
t[u].s=sin(a[l]);
t[u].c=cos(a[l]);
return;
}
int mid=(l+r) >> 1;
build(u << 1,l,mid);
build(u << 1 | 1,mid+1,r);
pu(u);
}
void add(int u,int l,int r,int L,int R,int v) {
if(L<=l && r<=R) {
double ts=t[u].s,tc=t[u].c;
t[u].s=ts*cos(v)+tc*sin(v);
t[u].c=tc*cos(v)-ts*sin(v);
t[u].tg+=v;
return;
}
pd(u);
int mid=(l+r)>>1;
if(L<=mid) add(u << 1,l,mid,L,R,v);
if(R>mid) add(u << 1 | 1,mid+1,r,L,R,v);
pu(u);
}
double qry(int u,int l,int r,int L,int R) {
if(L<=l && r<=R) return t[u].s;
pd(u);
int mid=(l+r) >> 1;
double res=0;
if(L<=mid) res+=qry(u << 1,l,mid,L,R);
if(R>mid) res+=qry(u << 1 | 1,mid+1,r,L,R);
return res;
}
int main() {
scanf("%lld",&n);
for(int i=1; i<=n; i++) scanf("%lld",&a[i]);
build(1,1,n);
scanf("%lld",&m);
while(m--) {
int op,l,r,v;
scanf("%d%d%d",&op,&l,&r);
if(op==1) {
scanf("%d",&v);
add(1,1,n,l,r,v);
}
else printf("%.1lf\n",qry(1,1,n,l,r));
}
return 0;
}
回复
共 9 条回复,欢迎继续交流。
正在加载回复...