全Wa求助
查看原帖
全Wa求助
483089
养熊人楼主2022/8/13 18:25
#include<bits/stdc++.h>
#define F(i,x,n) for(int i=x;i<=n;++i)
#define _F(i,x,n) for(int i=x;i>=n;--i)
#define lson x<<1
#define rson x<<1|1
#define int long long
using namespace std; 

inline int read(){
	int s=0;char c=getchar();bool flag=0;
	while(!isdigit(c))flag|=(c=='-'),c=getchar();
	while(isdigit(c))s=(s<<3)+(s<<1)+(c^48),c=getchar();
	return flag?-s:s;
}

const int N=2e5+5;

struct node{
	double sums,sumc;
}t[N<<2];

int a[N],tag[N];
int n,m;

void pushup(int x){
	t[x].sums=t[lson].sums+t[rson].sums;
	t[x].sumc=t[lson].sumc+t[rson].sumc;
}

void pushdown(int x){
	if(!tag[x])return;
	double t1=t[lson].sums,t2=t[lson].sumc;
	t[lson].sums=t1*cos((double)tag[x])+t2*sin((double)tag[x]),t[lson].sumc=t2*cos((double)tag[x])-t1*sin((double)tag[x]);
	t1=t[rson].sums,t2=t[rson].sumc;
	t[rson].sums=t1*cos((double)tag[x])+t2*sin((double)tag[x]),t[rson].sumc=t2*cos((double)tag[x])-t1*sin((double)tag[x]); 
	tag[lson]+=tag[x],tag[rson]+=tag[x],tag[x]=0;
}

void build(int x,int l,int r){
	if(l==r){
		t[x].sums=sin((double)a[l]),t[x].sumc=cos((double)a[l]);
		return;
	}
	int mid=l+r>>1;
	build(lson,l,mid),build(rson,mid+1,r);
	pushup(x);
}

void upd(int x,int l,int r,int L,int R,int v){
	if(l>R||r<L)return;
	if(L<=l&&r<=R){
		tag[x]+=v;
		double t1=t[x].sums,t2=t[x].sumc;
		t[x].sums=t1*cos((double)v)+t2*sin((double)v),t[x].sumc=t2*cos((double)v)-t1*sin((double)v);
		return;
	}
	pushdown(x);
	int mid=l+r>>1;
	upd(lson,l,mid,L,R,v),upd(rson,mid+1,r,L,R,v);
	pushup(x);
}

double qry(int x,int l,int r,int L,int R){
	if(l>R||r<L)return 0;
	if(L<=l&&r<=R){
		return t[x].sums;
	}
	pushdown(x);
	int mid=l+r>>1;
	return qry(lson,l,mid,L,R)+qry(rson,mid+1,r,L,R);
}

signed main(){
	n=read();
	F(i,1,n)a[i]=read();
	build(1,1,n);
	m=read();
	F(i,1,m){
		int op=read();
		if(op==1){
			int l=read(),r=read(),v=read();
			upd(1,1,n,l,r,v);
		}
		else{
			int l=read(),r=read();
			printf("%.1lf\n",qry(1,1,n,l,r)); 
		}
	}
	return 0;
}
2022/8/13 18:25
加载中...