社区讨论

过样例但听取WA声一片,求调

P6327区间加区间 sin 和参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@m23go7un
此快照首次捕获于
2024/10/10 23:36
去年
此快照最后确认于
2024/10/10 23:36
去年
查看原帖

过样例但听取WA声一片,求调

CPP
#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+5;
int n,m;
long long lazy[maxn<<2];
double se_tr[maxn<<2][2];//线段树,第二个维度0代表sin,1代表cos

void add(int p,int v){
	double sv=sin(v),cv=cos(v);
	double sp=se_tr[p][0]*cv+se_tr[p][1]*sv;
	double cp=se_tr[p][1]*cv-se_tr[p][0]*sv;
	se_tr[p][0]=sp;
	se_tr[p][1]=cp;
}

void push_down(int rt){
	add(rt<<1,lazy[rt]);
	add(rt<<1|1,lazy[rt]);
	lazy[rt<<1]+=lazy[rt];
	lazy[rt<<1|1]+=lazy[rt];
	lazy[rt]=0;
}

void update(int rt,int l,int r,int L,int R,int v){
	if(l>R || r<L) return;
	if(L<=l && r<=R){
		add(rt,v);
		lazy[rt]+=v;
		return;
	}push_down(rt);
	int mid=(l+r)>>1;
	update(rt<<1,l,mid,L,R,v);
	update(rt<<1|1,mid+1,r,L,R,v);
	se_tr[rt][0]=se_tr[rt<<1][0]+se_tr[rt<<1|1][0];
	se_tr[rt][1]=se_tr[rt<<1][1]+se_tr[rt<<1|1][1];
}

double query(int rt,int l,int r,int L,int R){
	if(l>R || r<L) return 0;
	if(L<=l && r<=R) return se_tr[rt][0];
	int mid=(l+r)>>1;
	return query(rt<<1,l,mid,L,R)+query(rt<<1|1,mid+1,r,L,R);
}

int main(){
	scanf("%d",&n);
	for(int i=1;i<=n<<2;i++)
		se_tr[i][1]=1;
	for(int i=1;i<=n;i++){
		int a;
		scanf("%d",&a);
		update(1,1,n,i,i,a);
	}scanf("%d",&m);
	while(m--){
		int op,l,r;
		scanf("%d%d%d",&op,&l,&r);
		if(op==1){
			int v;
			scanf("%d",&v);
			update(1,1,n,l,r,v);
		}else printf("%.1f\n",query(1,1,n,l,r));
	}
	return 0;
}

回复

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

正在加载回复...