社区讨论
过样例但听取WA声一片,求调
P6327区间加区间 sin 和参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @m23go7un
- 此快照首次捕获于
- 2024/10/10 23:36 去年
- 此快照最后确认于
- 2024/10/10 23:36 去年
过样例但听取WA声一片,求调
CPP#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+5;
int n,m;
long long lazy[maxn<<2];
double se_tr[maxn<<2][2];//线段树,第二个维度0代表sin,1代表cos
void add(int p,int v){
double sv=sin(v),cv=cos(v);
double sp=se_tr[p][0]*cv+se_tr[p][1]*sv;
double cp=se_tr[p][1]*cv-se_tr[p][0]*sv;
se_tr[p][0]=sp;
se_tr[p][1]=cp;
}
void push_down(int rt){
add(rt<<1,lazy[rt]);
add(rt<<1|1,lazy[rt]);
lazy[rt<<1]+=lazy[rt];
lazy[rt<<1|1]+=lazy[rt];
lazy[rt]=0;
}
void update(int rt,int l,int r,int L,int R,int v){
if(l>R || r<L) return;
if(L<=l && r<=R){
add(rt,v);
lazy[rt]+=v;
return;
}push_down(rt);
int mid=(l+r)>>1;
update(rt<<1,l,mid,L,R,v);
update(rt<<1|1,mid+1,r,L,R,v);
se_tr[rt][0]=se_tr[rt<<1][0]+se_tr[rt<<1|1][0];
se_tr[rt][1]=se_tr[rt<<1][1]+se_tr[rt<<1|1][1];
}
double query(int rt,int l,int r,int L,int R){
if(l>R || r<L) return 0;
if(L<=l && r<=R) return se_tr[rt][0];
int mid=(l+r)>>1;
return query(rt<<1,l,mid,L,R)+query(rt<<1|1,mid+1,r,L,R);
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n<<2;i++)
se_tr[i][1]=1;
for(int i=1;i<=n;i++){
int a;
scanf("%d",&a);
update(1,1,n,i,i,a);
}scanf("%d",&m);
while(m--){
int op,l,r;
scanf("%d%d%d",&op,&l,&r);
if(op==1){
int v;
scanf("%d",&v);
update(1,1,n,l,r,v);
}else printf("%.1f\n",query(1,1,n,l,r));
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...