和题解对拍每次都差0.1
查看原帖
和题解对拍每次都差0.1
536396
Uuuuuur_楼主2023/8/12 10:38
#include <bits/stdc++.h>
#define int unsigned long long
#define double long double
#define ls(x) ((x) << 1)
#define rs(x) ((x) << 1 | 1)
using namespace std;
const int N = 2e5 + 5;
int n, m;
double sins[N * 4];
double coss[N * 4];
int tag[N];
int a[N];
void pushup(int p) {
    sins[p] = sins[ls(p)] + sins[rs(p)];
    coss[p] = coss[ls(p)] + coss[rs(p)];
}
void rush(int p, int v) {
    double sinv = sin(v), cosv = cos(v);
    double tsin = sins[p] * cosv + coss[p] * sinv;
    double tcos = coss[p] * cosv - sins[p] * sinv;
    sins[p] = tsin;
    coss[p] = tcos;
}
void pushdown(int p) {
    if (tag[p]) {
        tag[ls(p)] += tag[p];
        rush(ls(p), tag[p]);
        tag[rs(p)] += tag[p];
        rush(rs(p), tag[p]);
        tag[p] = 0;
    }
}
void build(int l, int r, int p) {
    if (l == r) {
        sins[p] = sin(a[l]);
        coss[p] = cos(a[l]);
        return ;
    }
    int mid = l + r >> 1;
    build(l, mid, ls(p));
    build(mid + 1, r, rs(p));
    pushup(p);
}
void update(int l, int r, int x, int y, int v, int p) {
    if (x <= l && r <= y) {
        rush(p, v);
        tag[p] += v;
        return ;
    }
    pushdown(p);
    int mid = l + r >> 1;
    if (x <= mid) update(l, mid, x, y, v, ls(p));
    if (y > mid) update(mid + 1, r, x, y, v, rs(p));
    pushup(p);
}
double query(int l, int r, int x, int y, int p) {
    if (x <= l && r <= y) {
        return sins[p];
    }
    pushdown(p);
    int mid = l + r >> 1;
    double res = 0;
    if (x <= mid) res += query(l, mid, x, y, ls(p));
    if (y > mid) res += query(mid + 1, r, x, y, rs(p));
    return res;
}
signed main() {
   // freopen("std.in", "r", stdin);
   // freopen("data.out", "w", stdout);
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    cin >> m;
    build(1, n, 1);
    while (m--) {
        int op, l, r, v;
        cin >> op >> l >> r;
        if (op == 1) {
            cin >> v;
            update(1, n, l, r, v, 1);
        } else {
            
            cout << fixed << setprecision(1) << query(1, n, l, r, 1) << '\n';
        }
    }
    return 0;
}
2023/8/12 10:38
加载中...