简单的线段树模板,简单的三角函数公式,这两者结合起来本应是双倍快乐的AC,可是为什么会这样呢?[doge]
附悲剧的代码
#include<iostream>
#include<iomanip>
#include<cmath>
#define ll long long
using namespace std;
const int N=200020;
const double PI=3.1415926535;
ll n,m,o,u,v;ll a[N],add1[4*N],w;
double sin1[4*N],cos1[4*N],ans;//sin(α+β)=sinαcosβ+cosαsinβ;(2) cos(α+β)=cosαcosβ-sinαsinβ;
double sini(ll x){
double t=sin(double(x));
return t;
}
double cosi(ll x){
double t=cos(double(x));
return t;
}
void mtree(ll k,ll l,ll r){
if(l==r){
sin1[k]=sini(a[l]);
cos1[k]=cosi(a[l]);return;
}
ll mid=(l+r)>>1;
mtree(k<<1,l,mid);mtree(k<<1|1,mid+1,r);
sin1[k]=sin1[k<<1]+sin1[k<<1|1];
cos1[k]=cos1[k<<1]+cos1[k<<1|1];
return;
}
void add(ll k,ll l,ll r,ll v)
{
double s1=sin1[k],s2=cos1[k];
sin1[k]=s1*cosi(v)+s2*sini(v);
cos1[k]=s2*cosi(v)-s1*sini(v);
}
void pushdown(ll k,ll l,ll r){
if(add1[k]==0)return ;
ll mid=(l+r)>>1;
add(k<<1,l,mid,add1[k]);
add(k<<1|1,mid+1,r,add1[k]);
add1[k]=0;
}
double out(ll k,ll l,ll r,ll x,ll y){
if(l>=x&&r<=y)return sin1[k];
double ans=0.0;
ll mid=(l+r)>>1;
pushdown(k,l,r);
if(x<=mid)ans+=out(k<<1,l,mid,x,y);
if(mid<y)ans+=out(k<<1|1,mid+1,r,x,y);
return ans;
}
void modadd(ll k,ll l,ll r,ll x,ll y,ll v){
if(l>=x&&r<=y){
add(k,l,r,v);return;
}
ll mid=(l+r)>>1;
pushdown(k,l,r);
if(x<=mid)modadd(k<<1,l,mid,x,y,v);
if(mid<y) modadd(k<<1|1,mid+1,r,x,y,v);
sin1[k]=sin1[k<<1]+sin1[k<<1|1];
cos1[k]=cos1[k<<1]+cos1[k<<1|1];
}
int main()
{
cin>>n;
for(ll i=1;i<=n;i++)cin>>a[i];
mtree(1,1,n);
cin>>m;
cout<<setiosflags(ios::fixed)<<setprecision(1);
for(ll i=1;i<=m;i++){
cin>>o>>u>>v;
if(o==1){
cin>>w;
modadd(1,1,n,u,v,w);
}
else{
ans=out(1,1,n,u,v);
cout<<ans<<endl;
}
}
return 0;
}
附大型10WA现场 (大悲剧)……