为什么会这样呢?
查看原帖
为什么会这样呢?
233972
秋水1024楼主2020/8/2 22:38

简单的线段树模板,简单的三角函数公式,这两者结合起来本应是双倍快乐的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现场 (大悲剧)……

2020/8/2 22:38
加载中...