全WA求调
查看原帖
全WA求调
252549
Iwara楼主2024/4/10 19:31

RT

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ldb;
const ll MAXN=2e5+5;
ll n,q,op,x,y,z;
ll a[MAXN];
struct sgm_t{
	ldb sin_sum[MAXN<<2],cos_sum[MAXN<<2];
	long long tag[MAXN<<2];
	void add_tag(ll id,ldb sin_x,ldb cos_x){
		ldb sin_a=sin_sum[id],cos_a=cos_sum[id];
		sin_sum[id]=sin_a*cos_x+cos_a*sin_x;
		cos_sum[id]=cos_a*cos_x-sin_a*sin_x;
		return;
	}
	void push_up(ll id){
		sin_sum[id]=sin_sum[id<<1]+sin_sum[id<<1|1];
		cos_sum[id]=cos_sum[id<<1]+cos_sum[id<<1|1];
		return;
	}
	void push_down(ll id){
		if(!tag[id])return;
		ldb sin_x=sin(tag[id]*1.00),cos_x=cos(tag[id]*1.00);
		add_tag(id<<1,sin_x,cos_x);
		add_tag(id<<1|1,sin_x,cos_x);
		tag[id<<1]+=tag[id],tag[id<<1|1]+=tag[id];
		tag[id]=0;
		return;
	}
	void build(ll id,ll L,ll R){
		if(L>R)return;
		if(L==R){
			sin_sum[id]=sin(a[L]*1.00);
			cos_sum[id]=cos(a[L]*1.00);
			return;
		} 
		ll mid=(L+R)>>1;
		build(id<<1,L,mid);
		build(id<<1|1,mid+1,R);
		push_up(id);
		return;
	}
	void update(ll id,ll L,ll R,ll UL,ll UR,ldb delta){
		if(L>R||UR<L||R<UL)return;
		if(UL<=L&&R<=UR){
			add_tag(id,sin(delta*1.00),cos(delta*1.00));
			tag[id]+=delta;
			return;
		}
		ll mid=(L+R)>>1;
		push_down(id);
		if(UL<=mid)update(id<<1,L,mid,UL,UR,delta);
		if(UR>mid)update(id<<1|1,mid+1,R,UL,UR,delta);
		push_up(id);
		return;
	}
	ldb query(ll id,ll L,ll R,ll QL,ll QR){
		if(L>R||QR<L||R<QL)return 0;
		if(QL<=L&&R<=QR)return sin_sum[id];
		ll mid=(L+R)>>1;
		ldb res=0;
		push_up(id);
		if(QL<=mid)res+=query(id<<1,L,mid,QL,QR);
		if(QR>mid)res+=query(id<<1|1,mid+1,R,QL,QR); 
		return res;
	}
}S;
inline void read(ll &x){
    x = 0;
    char c = getchar();
    while(c<'0'||c>'9') c = getchar();
    while(c>='0'&&c<='9'){
        x = (x<<3)+(x<<1)+(c^48);
        c = getchar();
    }
}
signed main(){
//	ios::sync_with_stdio(0);
//	cin.tie(0);
//	cout.tie(0);
	read(n);
	for(int i=1;i<=n;i++)read(a[i]);
	S.build(1,1,n);
	read(q);
	for(int i=1;i<=n;i++){
		read(op);
		if(op==1){
			read(x),read(y),read(z);
			S.update(1,1,n,x,y,z);
		}
		else{
			read(x),read(y);
			printf("%.1lf\n",S.query(1,1,n,x,y));
		}
	}
	return 0;
} 

数据太强了/fn

2024/4/10 19:31
加载中...