0pts求助
查看原帖
0pts求助
983912
Linzijun_0607楼主2024/3/9 12:02

样例过了,但是全wa

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define bangdeng signed main()
int n,m,op,z,y,a[200010];
struct node
{
	int l,r,flag;
	double sina,cosa; 
} tr[800080];
void pushup(int u)
{
	tr[u].sina=tr[u<<1].sina+tr[u<<1|1].sina;
	tr[u].cosa=tr[u<<1].cosa+tr[u<<1|1].cosa;
}
void pushdown(int x){
    if(tr[x].flag){
    	int sinx=sin(tr[x<<1].flag),cosx=cos(tr[x<<1|1].flag),cosx1=tr[x<<1].cosa,cosx2=tr[x<<1|1].cosa,sinx1=tr[x<<1].sina,sinx2=tr[x<<1|1].sina;
    	tr[x<<1].sina=sinx*cosx1+cosx*sinx1;
    	tr[x<<1].cosa=cosx*cosx1-sinx*sinx1;
    	tr[x<<1|1].sina=sinx*cosx2+cosx*sinx2;
    	tr[x<<1|1].cosa=cosx*cosx2-sinx*sinx2;
        tr[x<<1].flag+=tr[x].flag;
        tr[x<<1|1].flag+=tr[x].flag;
		tr[x].flag=0;
    }
}
void build(int u,int l,int r)
{
	tr[u].l=l,tr[u].r=r;
	if(l==r)
	{
		tr[u].sina=sin(a[l]);
		tr[u].cosa=cos(a[l]);
		return;
	}
	int mid=(l+r)/2;
	build(u<<1,l,mid);
	build(u<<1|1,mid+1,r);	
	pushup(u);										
}
void update(int u,int l,int r,int x)
{
	if(l<=tr[u].l&&r>=tr[u].r){
		double sin1=tr[u].sina,cos2=tr[u].cosa,sinc=sin(x),cosc=cos(x);
		tr[u].sina=sin1*cosc+cos2*sinc;
		tr[u].cosa=cos2*cosc-sin1*sinc;
		tr[u].flag+=x;
		return;
	} 
	pushdown(u);
	int mid=tr[u].l+tr[u].r>>1;
	if(l<=mid) update(u<<1,l,r,x);
	if(r>mid) update(u<<1|1,l,r,x);
	pushup(u);
}
double q(int u,int l,int r)
{
	if(l<=tr[u].l&&r>=tr[u].r) return tr[u].sina;
	pushdown(u);
	int mid=tr[u].l+tr[u].r>>1;
	double res=0;
	if(l<=mid) res+=q(u<<1,l,r);
	if(r>mid) res+=q(u<<1|1,l,r);
	return res;
}
bangdeng
{
	cin>>n;
	for(int i=1;i<=n;i++) scanf("%lld",a+i);
	cin>>m;
	build(1,1,n);
	while(m--)
	{
		scanf("%lld%lld%lld",&op,&z,&y);
		if(op==1){
			int k;
			scanf("%lld",&k);
			update(1,z,y,k);
		}
		else printf("%.1lf\n",q(1,z,y));
	} 

} 
2024/3/9 12:02
加载中...