样例过了全WA求调
查看原帖
样例过了全WA求调
1417582
De___Bruyne楼主2024/10/29 10:28
#include<bits/stdc++.h>

using namespace std;
typedef long long LL;
const int N=2e5+10;
struct node{
	int l,r;
	double sine,cosi;
	int add=0;
}tr[N*4];
LL a[N];
int n,m,k,ll,rr;
double func(double t){
	return t=(int(t*100+5))/100.0;
}
void pushup(int u){
	auto &rt=tr[u],&ls=tr[u<<1],&rs=tr[u<<1|1];
	rt.sine=ls.sine+rs.sine;
	rt.cosi=ls.cosi+ls.cosi;
}

void pushdown(int u){
	auto &rt=tr[u],&ls=tr[u<<1],&rs=tr[u<<1|1];
	if(rt.add==0)return;
	double sx=sin(rt.add),cx=cos(rt.add);
	double lss=ls.sine,lsc=ls.cosi,rss=rs.sine,rsc=rs.cosi;
	ls.sine=lss*cx+lsc*sx;
	ls.cosi=lsc*cx-lss*sx;
	rs.sine=rss*cx+rsc*sx;
	rs.cosi=rsc*cx-rss*sx;
	rs.add+=rt.add;
	ls.add+=rt.add;
	rt.add=0;
}

void build(int u,int l,int r){
	tr[u].l=l,tr[u].r=r;
	if(l==r){
		tr[u].sine=sin(a[l]);
		tr[u].cosi=cos(a[l]); 
		return;
	}
	int mid=(l+r)>>1;
	build(u<<1,l,mid);
	build(u<<1|1,mid+1,r);
	pushup(u);
}
void modify(int u,int l,int r,LL ad){
	if(tr[u].l>=l&&tr[u].r<=r){
		double cx=cos(ad),sx=sin(ad);
		double ts=tr[u].sine,tc=tr[u].cosi;
		tr[u].sine=ts*cx+tc*sx;
		tr[u].cosi=tc*cx-ts*sx;
		tr[u].add+=ad;
		return;
	}
	pushdown(u);
	int mid=(tr[u].l+tr[u].r)>>1;
	if(l<=mid)modify(u<<1,l,r,ad);
	if(r>mid) modify(u<<1|1,l,r,ad);
	pushup(u);	
	return;
}
double query1(int u,int l,int r){
	if(tr[u].l>=l&&tr[u].r<=r)return tr[u].sine;
	pushdown(u);
	int mid=(tr[u].l+tr[u].r)>>1;
	if(r<=mid)return query1(u<<1,l,r);
	if(l>mid)return query1(u<<1|1,l,r);
	else return query1(u<<1,l,r)+query1(u<<1|1,l,r);	
}
int main(){
	cout<<fixed<<setprecision(1);
	ios::sync_with_stdio(false);
	cin.tie(nullptr),cout.tie(nullptr);
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,1,n);
	LL t;
	cin>>m;
	while(m--){
		cin>>k>>ll>>rr;
		if(k==1){
			cin>>t;
			modify(1,ll,rr,t);
		}
		else{
			cout<<query1(1,ll,rr)<<'\n';
		}
	}
	return 0;
}
 
2024/10/29 10:28
加载中...