社区讨论

蒟蒻刚学oi,wa0pts求条

P6327区间加区间 sin 和参与者 3已保存回复 9

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
8 条
当前快照
1 份
快照标识符
@mjbdut66
此快照首次捕获于
2025/12/18 19:54
2 个月前
此快照最后确认于
2025/12/18 20:42
2 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
long long n,m,a[N];
struct nd {
	double s,c;
	long long tg;
} t[N << 2];
void pu(int u) {
	t[u].s=t[u << 1].s+t[u << 1 | 1].s;
	t[u].c=t[u << 1].c+t[u << 1 | 1].c;
}
void pd(int u) {
	if(!t[u].tg) return;
	int v=t[u].tg;
	t[u << 1].tg+=v;
	double ts=t[u << 1].s,tc=t[u << 1].c;
	t[u<<1].s=ts*cos(v)+tc*sin(v);
	t[u<<1].c=tc*cos(v)-ts*sin(v);
	t[u << 1 | 1].tg+=v;
	ts=t[u << 1 | 1].s,tc=t[u << 1|1].c;
	t[u << 1 | 1].s=ts*cos(v)+tc*sin(v);
	t[u << 1 | 1].c=tc*cos(v)-ts*sin(v);
	t[u].tg=0;
}
void build(int u,int l,int r) {
	t[u].tg=0;
	if(l==r) {
		t[u].s=sin(a[l]);
		t[u].c=cos(a[l]);
		return;
	}
	int mid=(l+r) >> 1;
	build(u << 1,l,mid);
	build(u << 1 | 1,mid+1,r);
	pu(u);
}
void add(int u,int l,int r,int L,int R,int v) {
	if(L<=l && r<=R) {
		double ts=t[u].s,tc=t[u].c;
		t[u].s=ts*cos(v)+tc*sin(v);
		t[u].c=tc*cos(v)-ts*sin(v);
		t[u].tg+=v;
		return;
	}
	pd(u);
	int mid=(l+r)>>1;
	if(L<=mid) add(u << 1,l,mid,L,R,v);
	if(R>mid) add(u << 1 | 1,mid+1,r,L,R,v);
	pu(u);
}
double qry(int u,int l,int r,int L,int R) {
	if(L<=l && r<=R) return t[u].s;
	pd(u);
	int mid=(l+r) >> 1;
	double res=0;
	if(L<=mid) res+=qry(u << 1,l,mid,L,R);
	if(R>mid) res+=qry(u << 1 | 1,mid+1,r,L,R);
	return res;
}
int main() {
	scanf("%lld",&n);
	for(int i=1; i<=n; i++) scanf("%lld",&a[i]);
	build(1,1,n);
	scanf("%lld",&m);
	while(m--) {
		int op,l,r,v;
		scanf("%d%d%d",&op,&l,&r);
		if(op==1) {
			scanf("%d",&v);
			add(1,1,n,l,r,v);
		} 
		else printf("%.1lf\n",qry(1,1,n,l,r));
	}
	return 0;
}

回复

9 条回复,欢迎继续交流。

正在加载回复...