悬关求调,样例过0pts
查看原帖
悬关求调,样例过0pts
1116724
Chitose_楼主2024/7/1 21:32
#include<bits/stdc++.h>

using namespace std;

#define db double
const int maxn=2e5+10;
struct node{
	int l,r,tag;
	db cossum,sinsum;
}tree[maxn*4];
int n;
int a[maxn];
int opt,l,r,val;
int q;

void upd(int id,int val) {
	db si=tree[id].sinsum,co=tree[id].cossum;
	tree[id].sinsum=cos(val)*si+sin(val)*co;
	tree[id].cossum=cos(val)*co-sin(val)*si;
}

void pushup(int id) {
	tree[id].cossum=tree[id*2].cossum+tree[id*2+1].cossum;
	tree[id].sinsum=tree[id*2].sinsum+tree[id*2+1].sinsum;
}

void pushdown(int id) {
	upd(id*2,tree[id].tag),upd(id*2+1,tree[id].tag);
	tree[id].tag=0;
}

void build(int id,int l,int r) {
	tree[id].l=l,tree[id].r=r;
	tree[id].tag=tree[id].cossum=tree[id].sinsum=0;
	if(l==r) {
		tree[id].sinsum=sin(a[l]);
		tree[id].cossum=cos(a[l]);
		return;
	}
	int mid=(l+r)/2;
	build(id*2,l,mid),build(id*2+1,mid+1,r);
	pushup(id);
}

void update(int id,int l,int r,int val) {
	if(tree[id].l>r || tree[id].r<l) return;
	if(tree[id].l>=l && tree[id].r<=r) {
		upd(id,val);
		return;
	}
	pushdown(id);
	update(id*2,l,r,val),update(id*2+1,l,r,val);
	pushup(id);
}

db query(int id,int l,int r) {
	if(tree[id].l>r || tree[id].r<l) return 0;
	if(tree[id].l>=l && tree[id].r<=r) {
		return tree[id].sinsum;
	}
	pushdown(id);
	return query(id*2,l,r)+query(id*2+1,l,r);
}
int main() {
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	build(1,1,n);
	cin>>q;
	while(q--) {
		cin>>opt>>l>>r;
		if(opt==1) {
			cin>>val;
			update(1,l,r,val);
		}else cout<<fixed<<setprecision(1)<<query(1,l,r)<<endl;
	}
	return 0;
}
2024/7/1 21:32
加载中...