社区讨论

样例能过,线段树全RE求调

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

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@m5njnx9a
此快照首次捕获于
2025/01/08 14:54
去年
此快照最后确认于
2025/01/08 20:48
去年
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
#define N 500005
#define ls (p<<1)
#define rs (p<<1|1)
using namespace std;
int n,m;
long double a[N];
struct tree{
	int l,r;long double ssum,csum;int lz;
}tr[N*4];
void pls(int x,int y){
	tree T=tr[x];
	tr[x].ssum=T.ssum*cos(y)+T.csum*sin(y);
	tr[x].csum=T.csum*cos(y)-T.ssum*sin(y);
}
void pushup(int p){
	tr[p].ssum=tr[ls].ssum+tr[rs].ssum;
	tr[p].csum=tr[ls].csum+tr[rs].csum;
}
void pushdown(int p){
	if(tr[p].lz!=0){
		pls(ls,tr[p].lz);
		pls(rs,tr[p].lz);
		tr[ls].lz+=tr[p].lz;
		tr[rs].lz+=tr[p].lz;
		pushup(p);
	}
	tr[p].lz=0;
}
void build(int p,int l,int r){
	if(l==r){
		tr[p]={l,r,sin(a[l]),cos(a[l]),0};
		return;
	}
	tr[p].l=l;
	tr[p].r=r;
	int mid=(l+r)/2;
	build(ls,l,mid);
	build(rs,mid+1,r);
	pushup(p);
}
void mod(int p,int l,int r,int lz){
	if(tr[p].l>r||tr[p].r<l)return;
	if(tr[p].l>=l&&tr[p].r<=r){
		pls(p,lz);
		tr[p].lz+=lz;
		return;
	}
	pushdown(p);
	mod(ls,l,r,lz);
	mod(rs,l,r,lz);
	pls(tr[ls].ssum,tr[rs].ssum);
	pushup(p);
}
long double que(int p,int l,int r){
	if(tr[p].l>r||tr[p].r<l) return 0;
	if(tr[p].l>=l&&tr[p].r<=r)return tr[p].ssum;
	pushdown(p);
	return que(ls,l,r)+que(rs,l,r);
}
int l,r,v,f;
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;++i)cin>>a[i];
	cin>>m;
	build(1,1,n);
	while(m--){
		cin>>f>>l>>r;
		if(f==1){
			cin>>v;
			mod(1,l,r,v);
		}
		else if(f==2)cout<<fixed<<setprecision(1)<<que(1,l,r)<<"\n";
	}
	return 0;
}

回复

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

正在加载回复...