求助,只过了样例的代码,求大佬看看
查看原帖
求助,只过了样例的代码,求大佬看看
648693
12dwqsd楼主2022/8/15 00:36
#include <cmath>
#include <algorithm>
#include <iostream>

using namespace std;
using LL = long long;
const int N = 2e5 + 10;

struct Node{
    int l, r;
    double sumsin, sumcos;
    LL add;
}node[N * 4];

int n, m;
int q[N];

void pushup(int u){
    node[u].sumsin = node[u << 1].sumsin + node[u << 1 | 1].sumsin;
    node[u].sumcos = node[u << 1].sumcos + node[u << 1 | 1].sumcos;
}

void pushdown(Node& root, Node& left, Node& right){
    if(root.add){
        left.sumsin = left.sumsin * cos(root.add) + left.sumcos * sin(root.add);
        left.sumcos = left.sumcos * cos(root.add) - left.sumsin * sin(root.add);
        left.add += root.add;

        right.sumsin = right.sumsin * cos(root.add) + right.sumcos * sin(root.add);
        right.sumcos = right.sumcos * cos(root.add) - right.sumsin * sin(root.add);
        right.add += root.add;

        root.add = 0;
    }
}

void pushdown(int u){
    pushdown(node[u], node[u << 1], node[u << 1 | 1]);
}


void build(int u, int l, int r){
    node[u].l = l, node[u].r = r, node[u].add = 0;
    if(l == r){
        node[u].sumsin = sin(q[l]);
        node[u].sumcos = cos(q[l]);
        return;
    }

    int mid = l + r >> 1;
    build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
    pushup(u);
}

void modify(int u, int l, int r, int v){
    if(node[u].l >= l && node[u].r <= r){
        node[u].sumsin = node[u].sumsin * cos(v) + node[u].sumcos * sin(v);
        node[u].sumcos = node[u].sumcos * cos(v) - node[u].sumsin * sin(v);
        node[u].add += v;
    }else{
        pushdown(u);
        int mid = node[u].l + node[u].r >> 1;
        if(l <= mid) modify(u << 1, l, r, v);
        if(r > mid)  modify(u << 1 | 1, l, r, v);
        pushup(u);
    }
}

double query(int u, int l, int r){
    if(node[u].l >= l && node[u].r <= r){
        return node[u].sumsin;
    }else{
        pushdown(u);
        int mid = node[u].l + node[u].r >> 1;
        double res = 0;
        if(l <= mid) res += query(u << 1, l, r);
        if(r > mid) res += query(u << 1 | 1, l, r);
        return res;
    }
}

int main(){


    scanf("%d", &n);
    for(int i = 1; i <= n; i ++) scanf("%d", &q[i]);

    build(1, 1, n);

    scanf("%d", &m);
    int op, l, r, v;
    while(m --){
        scanf("%d", &op);
        if(op == 1){
            scanf("%d%d%d", &l, &r, &v);
            modify(1, l, r, v);
        }else{
            scanf("%d%d", &l, &r);
            double res = query(1, l, r);
            printf("%.1f\n", res);
        }
    }

    return 0;


}


2022/8/15 00:36
加载中...