样例过了 WA0pts 求助
查看原帖
样例过了 WA0pts 求助
495469
Amidst楼主2024/8/13 15:47

rt

#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
double sum_sin[800005],sum_cos[800005];
int add[800005];
int a[200005];
void _Build(int k,int l,int r)
{
	if(l==r)
	{
		sum_sin[k]=sin(a[l]);
		sum_cos[k]=cos(a[l]);
		return;
	}
	int mid=l+r>>1;
	_Build(k<<1,l,mid);
	_Build(k<<1|1,mid+1,r);
	sum_sin[k]=sum_sin[k<<1]+sum_sin[k<<1|1];
	sum_cos[k]=sum_cos[k<<1]+sum_cos[k<<1|1];
}
void addin(int k,int l,int r,int v)
{
	add[k]+=v;
	double temp_sin=sin(add[k]),temp_cos=cos(add[k]);
	double tmp_sin=sum_sin[k],tmp_cos=sum_cos[k];
	sum_sin[k]=temp_sin*tmp_cos+temp_cos*tmp_sin;
	sum_cos[k]=temp_cos*tmp_cos-temp_sin*tmp_sin;
}
void push_down(int k,int l,int r,int mid)
{
	if(add[k]==0) return;
	addin(k<<1,l,mid,add[k]);
	addin(k<<1|1,mid+1,r,add[k]);
	add[k]=0;
}
double _Query(int k,int l,int r,int x,int y)
{
	if(l>=x&&r<=y)
		return sum_sin[k];
	int mid=l+r>>1;
	double res=0;
	push_down(k,l,r,mid);
	if(x<=mid)
		res+=_Query(k<<1,l,mid,x,y);
	if(mid<y)
		res+=_Query(k<<1|1,mid+1,r,x,y);
	return res;
}
void _Update(int k,int l,int r,int x,int y,int v,double sinv,double cosv)
{
	if(l>=x&&r<=y)
	{
		add[k]+=v;
		double tmp_sin=sum_sin[k],tmp_cos=sum_cos[k];
		sum_sin[k]=sinv*tmp_cos+cosv*tmp_sin;
		sum_cos[k]=cosv*tmp_cos-sinv*tmp_sin;
		return;
	}
	int mid=l+r>>1;
	push_down(k,l,r,mid);
	if(x<=mid)
		_Update(k<<1,l,mid,x,y,v,sinv,cosv);
	if(mid<y)
		_Update(k<<1|1,mid+1,r,x,y,v,sinv,cosv);
	sum_sin[k]=sum_sin[k<<1]+sum_sin[k<<1|1];
	sum_cos[k]=sum_cos[k<<1]+sum_cos[k<<1|1];
}
signed main()
{
	scanf("%lld",&n);
	for(int i=1;i<=n;i++)
		scanf("%lld",&a[i]);
	_Build(1,1,n);
	scanf("%lld",&m);
	for(int i=1;i<=m;i++)
	{
		int op,x,y,z;
		scanf("%lld%lld%lld",&op,&x,&y);
		if(!(op^1))
		{
			scanf("%lld",&z);
			_Update(1,1,n,x,y,z,sin(z),cos(z));
		}
		else
			printf("%.1lf\n",_Query(1,1,n,x,y));
	}
	return 0;
}
2024/8/13 15:47
加载中...