萌新求助/kk
查看原帖
萌新求助/kk
113521
muyang_233楼主2022/8/17 15:03

本以为是小清新题结果给我整不会了/kk
sinsin 也存了历史版本,也开了 ll ,求调/bx

#include <cmath>
#include <cstdio>
using namespace std;
#define ll long long
struct TREE{
	double sumsin,sumcos;ll lazy;
}Tree[800005];
int n,m;
int a[200005];
template<typename T>
inline void input(T &x){
	x=0;char c=getchar();int p=1;
	while((c<'0'||c>'9')&&c!='-') c=getchar();
	if (c=='-') p=-1,c=getchar();
	while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-'0',c=getchar();x*=p;
}
inline void pushup(int id){
	Tree[id].sumsin=Tree[id<<1].sumsin+Tree[id<<1|1].sumsin;
	Tree[id].sumcos=Tree[id<<1].sumcos+Tree[id<<1|1].sumcos;
}
inline void pushdown(int id){
	if (Tree[id].lazy){
		double sums=Tree[id<<1].sumsin;
		double sumc=Tree[id<<1].sumcos;
		Tree[id<<1].sumsin=sums*cos(1.0*Tree[id].lazy)+sumc*sin(1.0*Tree[id].lazy);
		Tree[id<<1].sumcos=sumc*cos(1.0*Tree[id].lazy)-sums*sin(1.0*Tree[id].lazy);
		sums=Tree[id<<1|1].sumsin;
		sumc=Tree[id<<1|1].sumcos;
		Tree[id<<1|1].sumsin=sums*cos(1.0*Tree[id].lazy)+sumc*sin(1.0*Tree[id].lazy);
		Tree[id<<1|1].sumcos=sumc*cos(1.0*Tree[id].lazy)-sums*sin(1.0*Tree[id].lazy);
		Tree[id<<1].lazy+=Tree[id].lazy;
		Tree[id<<1|1].lazy+=Tree[id].lazy;
		Tree[id].lazy=0;
	}
}
void build(int l,int r,int id){
	if (l==r){
		Tree[id].sumsin=sin(1.0*a[l]);
		Tree[id].sumcos=cos(1.0*a[l]);
		return;
	}
	int mid=(l+r)>>1;
	build(l,mid,id<<1);
	build(mid+1,r,id<<1|1);
	pushup(id);
}
void update(int x,int y,ll v,int l,int r,int id){
	if (x<=l&&r<=y){
		double sums=Tree[id].sumsin;
		double sumc=Tree[id].sumcos;
		Tree[id].sumsin=sums*cos(1.0*v)+sumc*sin(1.0*v);
		Tree[id].sumcos=sumc*cos(1.0*v)-sums*sin(1.0*v);
		Tree[id].lazy=v;
		return;
	}
	pushdown(id);
	int mid=(l+r)>>1;
	if (x<=mid) update(x,y,v,l,mid,id<<1);
	if (y>mid) update(x,y,v,mid+1,r,id<<1|1);
	pushup(id);
}
double query(int x,int y,int l,int r,int id){
	if (x<=l&&r<=y){
		return Tree[id].sumsin;
	}
	pushdown(id);
	int mid=(l+r)>>1;double res=0;
	if (x<=mid) res+=query(x,y,l,mid,id<<1);
	if (y>mid) res+=query(x,y,mid+1,r,id<<1|1);
	return res;
}
int main(){
	input(n);
	for (int i=1;i<=n;i++){
		input(a[i]);
	}
	build(1,n,1);
	input(m);
	while(m--){
		int opt,l,r;
		input(opt);input(l);input(r);
		if (opt==1) {
			ll v;input(v);
			update(l,r,v,1,n,1);
		}
		else{
			printf("%.1lf\n",query(l,r,1,n,1));
		}
	}
	return 0;
}
``
2022/8/17 15:03
加载中...