全WA代码求调
查看原帖
全WA代码求调
255095
PragmaGCC楼主2021/1/24 22:13

rt,交了快一页了,死活找不出 bug 来,能帮忙调调吗

#include <cmath>
#include <cstdio>
#include <iomanip>
#include <iostream>
using namespace std;
#define int long long
#define ld long double
const int N = 2e5 + 5;
int n, m, a[N];
struct node {
    int l, r;
    ld ssin, scos;
    int add;
} t[N << 2];
#define ls(k) (k << 1)
#define rs(k) (k << 1 | 1)
void pushup(int k) {
    t[k].ssin = t[ls(k)].ssin + t[rs(k)].ssin;
    t[k].scos = t[ls(k)].ssin + t[rs(k)].scos;
}
void modify(int k, int delta) {
    ld sina = t[k].ssin, cosa = t[k].scos, sinx = sin(delta), cosx = cos(delta);
    t[k].ssin = sina * cosx + cosa * sinx;
    t[k].scos = cosa * cosx - sina * sinx;
    t[k].add += delta;
}
void build(int k, int l, int r) {
    t[k].l = l, t[k].r = r, t[k].add = 0;
    if (l == r) {
        t[k].ssin = (ld)sin(a[l]), t[k].scos = (ld)cos(a[l]);
        return;
    }
    const int mid = l + r >> 1;
    build(ls(k), l, mid), build(rs(k), mid + 1, r);
    pushup(k);
}
void pushdown(int k) {
    if (t[k].add == 0)
        return;
    modify(ls(k), t[k].add), modify(rs(k), t[k].add);
    t[k].add = 0;
}
void update(int k, int l, int r, int delta) {
    if (t[k].l >= l && t[k].r <= r) {
        modify(k, delta);
        return;
    }
    const int mid = t[k].l + t[k].r >> 1;
    pushdown(k);
    if (l <= mid)
        update(ls(k), l, r, delta);
    if (r > mid)
        update(rs(k), l, r, delta);
    pushup(k);
}
ld query(int k, int l, int r) {
    if (t[k].l >= l && t[k].r <= r)
        return t[k].ssin;
    pushdown(k);
    const int mid = t[k].l + t[k].r >> 1;
    ld res = 0;
    if (l <= mid)
        res += query(ls(k), l, r);
    if (r > mid)
        res += query(rs(k), l, r);
    pushup(k);
    return res;
}
signed main(void) {
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    build(1, 1, n);
    cin >> m;
    for (int opt, l, r, x; m; m--) {
        cin >> opt;
        if (opt == 1) {
            cin >> l >> r >> x;
            update(1, l, r, x);
        } else {
            cin >> l >> r;
            cout << fixed << setprecision(1) << query(1, l, r) << endl;
        }
    }
    return 0;
}
2021/1/24 22:13
加载中...