线段树,过不了样例求调!
查看原帖
线段树,过不了样例求调!
1218495
YZren楼主2025/1/13 19:30
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int maxn=2e5+10;
int n,m,a[maxn];
struct node{
	int l,r,lazy;
	double sum_sin,sum_cos;
} tree[maxn*4];
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
inline void triangle(int id,int val){
	double change_sin=tree[id].sum_sin*cos(val)+tree[id].sum_cos*sin(val);
	tree[id].sum_cos=tree[id].sum_cos*cos(val)-tree[id].sum_sin*sin(val);
	tree[id].sum_sin=change_sin;
}
inline void up(int id){
	tree[id].sum_cos=tree[id*2].sum_cos+tree[id*2+1].sum_cos;
	tree[id].sum_sin=tree[id*2+1].sum_sin+tree[id*2+1].sum_sin;
}
inline void down(int id){
	tree[id*2].lazy+=tree[id].lazy;
	triangle(id*2,tree[id].lazy);
	tree[id*2+1].lazy+=tree[id].lazy;
	triangle(id*2+1,tree[id].lazy);
	tree[id].lazy=0;
}
inline void build(int id,int l,int r){
	tree[id].l=l; tree[id].r=r;
	if(l==r){
		tree[id].sum_cos=cos(a[l]);
		tree[id].sum_sin=sin(a[l]);
		return ;
	}
	int mid=(l+r)/2;
	build(id*2,l,mid); build(id*2+1,mid+1,r);
	up(id);
}
inline 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){
		tree[id].lazy+=val;
		triangle(id,val);
		return ;
	}
	if(tree[id].lazy!=0) down(id);
	update(id*2,l,r,val); update(id*2+1,l,r,val);
	up(id);
}
inline double ask_sum_sin(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].sum_sin;
	if(tree[id].lazy!=0) down(id);
	return (ask_sum_sin(id*2,l,r)+ask_sum_sin(id*2+1,l,r));
}
inline void work(){
	n=read();
	for(int i=1;i<=n;i++) a[i]=read();
	build(1,1,n); m=read();
	while(m--){
		int opt=read(),l=read(),r=read(),val;
		if(opt==1) val=read(),update(1,l,r,val);
		else cout<<fixed<<setprecision(1)<<ask_sum_sin(1,l,r)<<endl;
	}
} 
signed main(){work();return 0;}
2025/1/13 19:30
加载中...