求助线段树WA0分
查看原帖
求助线段树WA0分
436011
Inf_Love楼主2022/10/18 21:04

写吐了,ll开了,历史版本存了,其他错误也都找了,就是过不去

#include <iostream>
#include <cmath>
using namespace std;
#define int long long
#define MAX_N 200010
int n,m;
double a[MAX_N],sina[MAX_N * 4],cosa[MAX_N * 4],mark[MAX_N * 4];
void pushup(int k){
    sina[k] = sina[k << 1] + sina[k << 1 | 1];
    cosa[k] = cosa[k << 1] + cosa[k << 1 | 1];
    return;
}
void build(int l,int r,int k){
    if(l == r){
        sina[k] = sin(a[l]);
        cosa[k] = cos(a[l]);
        return;
    }
    int mid = l + ((r - l) >> 1);
    build(l,mid,k << 1);
    build(mid + 1,r,k << 1 | 1);
    pushup(k);
}
void pushdown(int l,int r,int k){
    sina[k << 1] = cos(mark[k]) * sina[k << 1] + sin(mark[k]) * cosa[k << 1];
    cosa[k << 1] = cos(mark[k]) * cosa[k << 1] - sin(mark[k]) * sina[k << 1];
    sina[k << 1 | 1] = cos(mark[k]) * sina[k << 1 | 1] + sin(mark[k]) * cosa[k << 1 | 1];
    cosa[k << 1 | 1] = cos(mark[k]) * cosa[k << 1 | 1] - sin(mark[k]) * sina[k << 1 | 1];
    mark[k << 1] += mark[k];
    mark[k << 1 | 1] += mark[k];
    mark[k] = 0; 
}
void updata(int L,int R,int l,int r,int k,int v){
    if(L <= l && R >= r){
        double sa = sina[k],ca = cosa[k];
        sina[k] = cos(v) * sa + sin(v) * ca;
        cosa[k] = cos(v) * ca - sin(v) * sa;
        mark[k] += v;
        return;
    }
    pushdown(l,r,k);
    int mid = l + ((r - l) >> 1);
    if(L <= mid)updata(L,R,l,mid,k << 1,v);
    if(R > mid)updata(L,R,mid + 1,r,k << 1 | 1,v);
    pushup(k);
}
double query(int L,int R,int l,int r,int k){
    if(L <= l && R >= r) return sina[k];
    pushdown(l,r,k);
    int mid = l + ((r - l) >> 1);
    double res = 0;
    if(L <= mid)res += query(L,R,l,mid,k << 1);
    if(R > mid)res += query(L,R,mid + 1,r,k << 1 | 1);
    return res;
}
signed main(){
    cin >> n;
    for(int i = 1;i <= n;i++)cin >> a[i];
    build(1,n,1);
    cin >> m;
    while(m--){
        int opt,l,r,v;
        cin >> opt >> l >> r;
        if(opt == 1){
            cin >> v;
            updata(l,r,1,n,1,v);
        }
        else{
            printf("%.1lf \n",query(l,r,1,n,1));
        }
    }
    return 0;
}
2022/10/18 21:04
加载中...