#include <bits/stdc++.h>
#define int long long
#define db double
using namespace std;
const int N=2e5+10;
int cnt=0;
struct node
{
int l,r,lz;
db sinm,cosm;
}nd[N*4];
int n,a[N],oqt,m,l,r,v;
void push_up(int u)
{
nd[u].sinm+=nd[u*2].sinm+nd[u*2+1].sinm;
nd[u].cosm+=nd[u*2].cosm+nd[u*2+1].cosm;
}
db shc(int a,int b)
{return nd[a].sinm*cos(b)+nd[a].cosm*sin(b);}
db chc(int a,int b)
{return nd[a].cosm*cos(b)-nd[a].sinm*sin(b);}
void push_down(int u)
{
if(!nd[u].lz)return;
int lz=nd[u].lz;
nd[u*2].lz+=lz;
nd[u*2+1].lz+=lz;
nd[u*2].sinm=shc(u*2,lz);
nd[u*2].cosm=chc(u*2,lz);
nd[u*2+1].sinm=shc(u*2+1,lz);
nd[u*2+1].cosm=chc(u*2+1,lz);
nd[u].lz=0;
}
void build(int l,int r,int u)
{
nd[u].l=l,nd[u].r=r;
nd[u].cosm=nd[u].sinm =nd[u].lz=0;
if(l==r)
{nd[u].sinm=sin(a[l]);
nd[u].cosm=cos(a[l]);return ;}
int mid=(l+r)>>1;
build(l,mid,u*2);
build(mid+1,r,u*2+1);
push_up(u);
}
void change(int l,int r,int v,int u)
{
if(nd[u].l>=l&&nd[u].r<=r){
nd[u].lz+=v;
nd[u].sinm=shc(u,v);
nd[u].cosm=chc(u,v);
return;
}
push_down(u);
int mid=(nd[u].l+nd[u].r)>>1;
if(mid>=l)change(l,r,v,u*2);
if(mid<r) change(l,r,v,u*2+1);
push_up(u);
}
db query(int l,int r,int u)
{
if(nd[u].l>=l&&nd[u].r<=r)
{
return nd[u].sinm;
}db ans=0;
push_down(u);
int mid=(nd[u].l+nd[u].r)>>1;
if(mid>=l)ans+=query(l,r,u*2);
if(mid<r)ans+=query(l,r,u*2+1);
return ans;
}
signed main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
build(1,n,1);
cin>>m;
while(m--)
{
cin>>oqt>>l>>r;
if(oqt==1)
{
cin>>v;
change(l,r,v,1);
}
else
{
printf("ans:%.1lf\n",query(l,r,1));
}
}
return 0;
}
本人是蒟蒻,真的调不动了,求助一下。 代码情况:样例输出第三个输出了-1.7,而且全部超时,求捞