样例过了,0pts,求调
查看原帖
样例过了,0pts,求调
213192
niubi_aaa楼主2024/11/20 20:23

#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[2000104]; void pushup(int u){ t[u].sin_sum=t[u2].sin_sum+t[u2+1].sin_sum; t[u].cos_sum=t[u2].cos_sum+t[u2+1].cos_sum; } void pushdown(int u){ if(t[u].add){ t[u2].add+=t[u].add; t[u2+1].add+=t[u].add; double res=t[u2].sin_sum; t[u2].sin_sum=t[u2].sin_sumcos(t[u].add)+t[u2].cos_sumsin(t[u].add); t[u2].cos_sum=t[u2].cos_sumcos(t[u].add)-ressin(t[u].add); res=t[u2+1].sin_sum; t[u2+1].sin_sum=t[u2+1].sin_sumcos(t[u].add)+t[u2+1].cos_sumsin(t[u].add); t[u2+1].cos_sum=t[u2+1].cos_sumcos(t[u].add)-ressin(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(u2,l,mid); build(u2+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_sumcos(x)+t[u].cos_sumsin(x); t[u].cos_sum=t[u].cos_sumcos(x)-ressin(x); return; } pushdown(u); int mid=(t[u].l+t[u].r)/2; if(l<=mid)update(u2,l,r,x); if(r>mid)update(u2+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(u2,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; }

#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:23
加载中...