MnZn求助
查看原帖
MnZn求助
308439
__mcx_楼主2022/10/25 20:10

样例过了,改了几次都是wa,麻烦大佬帮忙看看

#include<bits/stdc++.h>
#define ll long long
#define dl double
#define lp (p<<1)
#define rp (p<<1|1)
#define mid ((l+r)>>1)
using namespace std;
inline ll read(){
	ll w=1,s=0;char ch=getchar();
	while(ch<'0'||ch>'9') w=(ch=='-'?-1:1),ch=getchar();
	while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
	return w*s;
}
const int nn = 2e5+10;
struct tree{
	dl cs,sn;
	ll tag;
}t[nn<<2];
ll a[nn],n,m,op;
inline void up (ll p){
	t[p].sn=t[lp].sn+t[rp].sn;
	t[p].cs=t[lp].cs+t[rp].cs;
	return;
}
void build(ll p,ll l,ll r){
	if(l==r){
		t[p].sn=sin(a[l]);
		t[p].cs=cos(a[l]);
		t[p].tag=0;
		return;
	}
	build(lp,l,mid);
	build(rp,mid+1,r);
	up(p);
}
inline void push_down(ll p){
	if(t[p].tag==0) return;
	dl x=t[p].sn,y=t[p].cs;
	t[p].sn=1.0*x*cos(t[p].tag)+1.0*y*sin(t[p].tag);
	t[p].cs=1.0*y*cos(t[p].tag)-1.0*x*sin(t[p].tag);
	t[lp].tag+=t[p].tag;
	t[rp].tag+=t[p].tag;
	t[p].tag=0;
	return;
}
void modify(ll p,ll l,ll r,ll L,ll R,ll v){
	if(L<=l&&r<=R){
		t[p].tag+=v;
		dl x=t[p].sn,y=t[p].cs;
		t[p].sn=x*cos(v)+y*sin(v);
		t[p].cs=y*cos(v)-x*sin(v);
		return;
	}
	push_down(p);
	if(mid>=L) modify(lp,l,mid,L,R,v);
	if(mid<R) modify(rp,mid+1,r,L,R,v);
	up(p);
	return;
}
dl query(ll p,ll l,ll r,ll L,ll R){
	if(L<=l&&r<=R) return t[p].sn;
	dl res=0;
	push_down(p);
	if(L<=mid) res+=query(lp,l,mid,L,R);
	if(mid<R) res+=query(rp,mid+1,r,L,R);
	up(p);
	return res;
}
ll x,y,v;
int main(){
	n=read();
	for(int i=1;i<=n;i++) a[i]=read();
	build(1,1,n);
	m=read();
	while(m--){
		op=read();x=read();y=read();
		if(op==1){
			v=read();
			modify(1,1,n,x,y,v);
		}
		else{
			dl ans = query(1,1,n,x,y);
//			printf("%.1f\n",work(ans));
			printf("%.1f\n",ans);
		}
	}
	return 0;
} 
2022/10/25 20:10
加载中...