社区讨论

求调,样例过全WA

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

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@mhjh0vav
此快照首次捕获于
2025/11/04 02:26
4 个月前
此快照最后确认于
2025/11/04 02:26
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;

const int N=2e5+10;

int n,m;
long long a[N],lz[N*4];
double sins[N*4],coss[N*4];
struct node{
	int l;
	int r;
};
node tree[N*4];

void update(int u,long long v){//和差角公式处理 
	double sinx=sin(v),cosx=cos(v);
	double sina=sins[u],cosa=coss[u];
	sins[u]=sina*cosx+cosa*sinx;
	coss[u]=cosa*cosx-sina*sinx;
}

void pushdown(int u){
	if(lz[u]){//消除懒标记 
		lz[u*2]+=lz[u];
		lz[u*2+1]+=lz[u];
		update(u*2,lz[u]);
		update(u*2+1,lz[u]);
		lz[u]=0;
	}
}

void build(int u,int l,int r){
	tree[u].l=l,tree[u].r=r;
	if(l==r){
		sins[u]=sin(a[l]);
		coss[u]=cos(a[l]);
		return ;
	}
	int mid=(l+r)>>1;
	build(u*2,l,mid);
	build(u*2+1,mid+1,r);
	sins[u]=sins[u*2]+sins[u*2+1];
	coss[u]=coss[u*2]+coss[u*2+1];
}

void add(int u,int l,int r,long long v){
	if(l<=tree[u].l&&r>=tree[u].r){
		update(u,v);
		lz[u]+=v;
		return ;
	}
	int mid=(tree[u].l+tree[u].r)>>1;
	if(mid>=l) add(u*2,l,r,v);
	if(mid<r) add(u*2+1,l,r,v);
	sins[u]=sins[u*2]+sins[u*2+1];
	coss[u]=coss[u*2]+coss[u*2+1];
}

double query(int u,int l,int r){
	double sum=0;
	if(l<=tree[u].l&&r>=tree[u].r)
		return sins[u];
	pushdown(u);
	int mid=(tree[u].l+tree[u].r)>>1;
	if(mid>=l) sum+=query(u*2,l,r);
	if(mid<r) sum+=query(u*2+1,l,r);
	return sum;
}

int main (){
	
	cin >> n ;
	for(int i=1;i<=n;i++) cin >> a[i];
	
	build(1,1,n);
	
	int op,x,y;
	long long v;
	cin >> m;
	for(int i=1;i<=m;i++){
		cin >> op >> x >> y ;
		if(op==1){
			cin >> v;
			add(1,x,y,v);
		}else 
			cout << fixed << setprecision(1) << query(1,x,y) << '\n';
	}
	
	return 0;
}

回复

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

正在加载回复...