样例过了,全WA求助
查看原帖
样例过了,全WA求助
309796
jknbhbuy楼主2021/10/12 20:03
#include<bits/stdc++.h>
#define N 500005

using namespace std;

int n,m;
double a[N];
struct node{
	int l,r;
	double add;
	double zsin;
	double zcos;
}t[N*4];
void build(int L,int R,int k){
	t[k].l=L;
	t[k].r=R;
	if(L==R){
		t[k].zsin=sin(a[L]);
		t[k].zcos=cos(a[L]);
		return;
	}
	int mid=(L+R)>>1;
	build(L,mid,k<<1);
	build(mid+1,R,k<<1|1);
	t[k].zsin=t[k<<1].zsin+t[k<<1|1].zsin;
	t[k].zcos=t[k<<1].zcos+t[k<<1|1].zcos;
}
//sin(a+b)=sin(a)cos(b)+cos(a)sin(b)
//cos(a+b)=cos(a)cos(b)-sin(a)sin(b)
void down(int k){
	double c1=t[k<<1].zsin;
	double c2=t[k<<1].zcos;
	double C1=t[k<<1|1].zsin;
	double C2=t[k<<1|1].zcos;
	
	t[k<<1].zsin+=( cos(t[k].add) * c1 + sin(t[k].add) * c2 );
	t[k<<1|1].zsin+=( cos(t[k].add) * C1 + sin(t[k].add) * C2 );
	
	t[k<<1].zcos+=( cos(t[k].add) * c2 - sin(t[k].add) * c1 );
	t[k<<1|1].zcos+=( cos(t[k].add) * C2 - sin(t[k].add) * C1);
	
	t[k<<1].add+=t[k].add;
	t[k<<1|1].add+=t[k].add;
	
	t[k].add=0;
}
void up(int L,int R,double v,int k){
	if(L<=t[k].l&&R>=t[k].r){
		double c1=t[k].zsin;
		double c2=t[k].zcos;
		t[k].zsin=( cos(v) * c1 + sin(v) * c2);//////////////
		t[k].zcos=( cos(v) * c2 - sin(v) * c1);
		t[k].add+=v;
		return;
	}
	if(t[k].add)down(k);
	int mid=(t[k].l+t[k].r)>>1;
	if(L<=mid){
		up(L,R,v,k<<1);
	}
	if(R>mid){
		up(L,R,v,k<<1|1);
	}
	t[k].zsin=t[k<<1].zsin+t[k<<1|1].zsin;
	t[k].zcos=t[k<<1].zcos+t[k<<1|1].zcos;
}
double ans=0.0;
void ask(int L,int R,int k){
	if(L<=t[k].l&&R>=t[k].r){
		ans+=t[k].zsin;
		return;
	}
	if(t[k].add)down(k);
	int mid=(t[k].l+t[k].r)>>1;
	if(L<=mid){
		ask(L,R,k<<1);
	}
	if(R>mid){
		ask(L,R,k<<1|1);
	}
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,n,1);
	cin>>m;
	for(int i=1;i<=m;i++){
		int op;
		cin>>op;
		if(op==1){
			int le,ri,val;
			cin>>le>>ri>>val;
			up(le,ri,val,1);
		}
		else if(op==2){
			int le,ri;
			cin>>le>>ri;
			ask(le,ri,1);
			printf("%.1lf\n",ans);
			ans=0;
		}
	}
	return 0;
}
2021/10/12 20:03
加载中...