样例过了,但全WA!!!求调
查看原帖
样例过了,但全WA!!!求调
1166838
china123楼主2024/5/3 22:58
#include<bits/stdc++.h>
#define ls p<<1
#define rs p<<1|1
using namespace std;
typedef long long LL;
const int  N=2e5+10;
struct tree
{
	int l,r;double s,c;LL tg;
}tr[4*N];
int a[N];
int n,m;
double sinx,cosx;
void pushup(int p)
{
	tr[p].s=tr[ls].s+tr[rs].s;
	tr[p].c=tr[ls].c+tr[rs].c;
}
void update(int p,double a2,double b2)
{
	double a1=tr[p].s,b1=tr[p].c;
	tr[p].c=b1*b2-a1*a1;
	tr[p].s=a1*b2+b2*a1;
}
void pushdown(int p)
{
	LL k=tr[p].tg;
	if(tr[p].tg==0) return;
	if(k!=0)
	{
		tr[ls].tg+=k;
		tr[rs].tg+=k;
		double a2=sin(k),b2=cos(k);
		update(ls,a2,b2),update(rs,a2,b2);
		tr[p].tg=0;
	}
}
void build(int p,int l,int r)
{
	tr[p]={l,r};
	if(l==r)
	{   
		tr[p].s=sin(a[l]),tr[p].c=cos(a[l]);
		return;
	} 
	int mid=l+r>>1;
	build(ls,l,mid),build(rs,mid+1,r);
	pushup(p); 
}
void change(int p,int x,int y,int k)
{
	if(x<=tr[p].l&&tr[p].r<=y)
	{
		tr[p].tg+=k;
		update(p,sinx,cosx);
		return;
	}
	pushdown(p);
	int mid=tr[p].l+tr[p].r>>1;
	if(x<=mid) change(ls,x,y,k);
	if(y>mid) change(rs,x,y,k);
	pushup(p); 
}
double q(int p,int x,int y)
{
	if(x<=tr[p].l&&tr[p].r<=y) return tr[p].s;
	pushdown(p);
	int mid=tr[p].l+tr[p].r>>1;
	double res=0;
	if(x<=mid) res=q(ls,x,y);
	if(y>mid) res+=q(rs,x,y);
	return res;
}
int main()
{
	scanf("%d", &n);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	build(1,1,n);
	scanf("%d", &m);
	while(m--)
	{
		int x,l1,r1;
		scanf("%d%d%d", &x, &l1, &r1);
		if(x==1)
		{
			int v;
			scanf("%d",&v);
			sinx=sin(v),cosx=cos(v);
			change(1,l1,r1,v);
		}
		else if(x==2)
		{
			printf("%.1lf\n",q(1,l1,r1));
		}
	}
	return 0;
}

2024/5/3 22:58
加载中...