过了样例,0pts求调
查看原帖
过了样例,0pts求调
213192
niubi_aaa楼主2024/11/20 20:25
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m;
int a[200010];
struct node{
    int l,r;
    double sin_sum,cos_sum;
    ll add;
}t[200010*4];
void pushup(int u){
    t[u].sin_sum=t[u*2].sin_sum+t[u*2+1].sin_sum;
    t[u].cos_sum=t[u*2].cos_sum+t[u*2+1].cos_sum;
}
void pushdown(int u){
    if(t[u].add){
        t[u*2].add+=t[u].add;
        t[u*2+1].add+=t[u].add;
        double res=t[u*2].sin_sum;
        t[u*2].sin_sum=t[u*2].sin_sum*cos(t[u].add)+t[u*2].cos_sum*sin(t[u].add);
        t[u*2].cos_sum=t[u*2].cos_sum*cos(t[u].add)-res*sin(t[u].add);
        res=t[u*2+1].sin_sum;
        t[u*2+1].sin_sum=t[u*2+1].sin_sum*cos(t[u].add)+t[u*2+1].cos_sum*sin(t[u].add);
        t[u*2+1].cos_sum=t[u*2+1].cos_sum*cos(t[u].add)-res*sin(t[u].add);
        t[u].add=0;
    }
}
void build(int u,int l,int r){
    t[u]={l,r};
    if(l==r){
        t[u].sin_sum=sin(a[l]);
        t[u].cos_sum=cos(a[l]);
        return;
    }
    int mid=(l+r)/2;
    build(u*2,l,mid);
    build(u*2+1,mid+1,r);
    pushup(u);
}
void update(int u,int l,int r,int x){
    if(t[u].l>=l&&t[u].r<=r){
        t[u].add+=x;
        double res=t[u].sin_sum;
        t[u].sin_sum=t[u].sin_sum*cos(x)+t[u].cos_sum*sin(x);
        t[u].cos_sum=t[u].cos_sum*cos(x)-res*sin(x);
        return;
    }
    pushdown(u);
    int mid=(t[u].l+t[u].r)/2;
    if(l<=mid)update(u*2,l,r,x);
    if(r>mid)update(u*2+1,l,r,x);
    pushup(u);
}
node query(int u,int l,int r){
    if(t[u].l>=l&&t[u].r<=r)return t[u];
    pushdown(u);
    int mid=(t[u].l+t[u].r)/2;
    node res;
    if(l<=mid)res=query(u*2,l,r);
    if(r>mid){
        node res1=query(u*2+1,l,r);
        res.sin_sum=res.sin_sum+res1.sin_sum;
        res.cos_sum=res.cos_sum+res1.cos_sum;
    }
    return res;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    int m;
    cin>>m;
    build(1,1,n);
    while(m--){
        int op;
        cin>>op;
        if(op==1){
            int l,r,x;
            cin>>l>>r>>x;
            update(1,l,r,x);
        }
        else{
            int l,r;
            cin>>l>>r;
            printf("%.1lf\n",query(1,l,r).sin_sum);
        }
    }
    return 0;
}
2024/11/20 20:25
加载中...