线段树死循环求救
查看原帖
线段树死循环求救
772875
RAY091016楼主2025/8/30 11:23

rt,code:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,a[200200],op,l,r,v;
struct segtree{
	int l,r,tag;
	double sin,cos;
}t[800800];
void pushdown(int p){
	if(!t[p].tag){
		t[p*2].sin=t[p*2].sin*cos(t[p].tag)+t[p*2].cos*sin(t[p].tag),t[p*2].cos=t[p*2].cos*cos(t[p].tag)-t[p*2].sin*sin(t[p].tag);
		t[p*2+1].sin=t[p*2+1].sin*cos(t[p].tag)+t[p*2+1].cos*sin(t[p].tag),t[p*2+1].cos=t[p*2+1].cos*cos(t[p].tag)-t[p*2+1].sin*sin(t[p].tag);
		t[p*2].tag+=t[p].tag;
		t[p*2+1].tag+=t[p].tag;
		t[p].tag=0;
	}
}
void build(int p,int l,int r){
	t[p].l=l,t[p].r=r,t[p].tag=0;
	if(l==r){
		t[p].sin=sin(a[l]);
		t[p].cos=cos(a[l]);
		return ;
	}
	t[p].sin=(t[p*2].sin+t[p*2+1].sin);
	t[p].cos=(t[p*2].cos+t[p*2+1].cos);
}
void change(int p,int l,int r,int c){
	if(l<=t[p].l&&t[p].r<=r){
		t[p].tag+=c;
		t[p].sin=t[p].sin*cos(c)+t[p].cos*sin(c),t[p].cos=t[p].cos*cos(c)-t[p].sin*sin(c);
		return ; 
	}
	pushdown(p);
	int mid=(t[p].l+t[p].r)>>1;
	if(l<=mid){
		change(p*2,l,r,c);
	}
	if(r>mid){
		change(p*2+1,l,r,c);
	} 
	t[p].sin=t[p*2].sin+t[p*2+1].sin;
	t[p].cos=t[p*2].cos+t[p*2+1].cos;
}
double ask(int p,int l,int r){
	if(l<=t[p].l&&r>=t[p].r){
		return t[p].sin;
	}
	pushdown(p);
	int mid=(t[p].l+t[p].r)>>1;
	double val=0;
	if(l<=mid){
		val+=ask(p*2,l,r);
	}
	if(r>mid){
		val+=ask(p*2+1,l,r);
	}
	return val;
}
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,1,n);
	cin>>m;
	for(int i=1;i<=m;i++){
		cin>>op;
		if(op==1){
			cin>>l>>r>>v;
			change(1,l,r,v);
		}
		else{
			cin>>l>>r;
			cout<<fixed<<setprecision(1)<<ask(1,l,r)<<endl;
		}
	}
	return 0;
}
2025/8/30 11:23
加载中...