社区讨论

全 WA,已趋势

P6327区间加区间 sin 和参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mkmn3fwy
此快照首次捕获于
2026/01/20 21:38
4 周前
此快照最后确认于
2026/01/24 13:25
4 周前
查看原帖
人已经调麻了(o′ω`o),始终全 WA,可以回炉重造了。
有没有 dalao 帮帮这个蒟蒻看看代码问题?是逻辑错误还是炸精度了?
CPP
#include <cmath>
#include <cstdio>
using namespace std;
using dd = double;
const int N = 2e5 + 5;
int n, m;
int a[N];
#define lp (p << 1)
#define rp (p << 1 | 1)
struct SegTree {
  struct Node {
    int l, r;
    dd ssum, csum;
    bool tag;
    dd stag, ctag;
  } tr[N << 2];
  void pushup(int p) {
    tr[p].ssum = tr[lp].ssum + tr[rp].ssum;
    tr[p].csum = tr[lp].csum + tr[rp].csum;
  }
  void apply(Node &cr, dd ts, dd tc) {
    static dd tsin, tcos;
    tsin = cr.ssum, tcos = cr.csum;
    cr.ssum = tsin * tc + tcos * ts;
    cr.csum = tcos * tc - tsin * ts;
    tsin = cr.stag, tcos = cr.ctag;
    cr.stag = tsin * tc + tcos * ts;
    cr.ctag = tcos * tc - tsin * ts;
    cr.tag = 1;
  }
  void pushdown(int p) {
    if (!tr[p].tag)
      return;
    dd ts = tr[p].stag, tc = tr[p].ctag;
    apply(tr[lp], ts, tc);
    apply(tr[rp], ts, tc);
    tr[p].stag = 0, tr[p].ctag = 1;
    tr[p].tag = 0;
  }
  void build(int p, int l, int r) {
    tr[p].l = l;
    tr[p].r = r;
    if (l == r) {
      tr[p].ssum = sin(a[l]);
      tr[p].csum = cos(a[l]);
      tr[p].stag = 0, tr[p].ctag = 1;
      tr[p].tag = 0;
      return;
    }
    int mid = (l + r) >> 1;
    build(lp, l, mid), build(rp, mid + 1, r);
    pushup(p);
  }
  void update(int p, int l, int r, dd s, dd c) {
    if (tr[p].l >= l && tr[p].r <= r) {
      apply(tr[p], s, c);
      return;
    }
    pushdown(p);
    if (tr[lp].r >= l)
      update(lp, l, r, s, c);
    if (tr[rp].l <= r)
      update(rp, l, r, s, c);
    pushup(p);
  }
  dd query(int p, int l, int r) {
    if (tr[p].l >= l && tr[p].r <= r)
      return tr[p].ssum;
    pushdown(p);
    dd res = 0;
    if (tr[lp].r >= l)
      res += query(lp, l, r);
    if (tr[rp].l <= r)
      res += query(rp, l, r);
    return res;
  }
} seg;
void update(int l, int r, int k) {
  dd s = sin(k), c = cos(k);
  seg.update(1, l, r, s, c);
}
dd query(int l, int r) { return seg.query(1, l, r); }
#undef lp
#undef rp
int op, l, r, k;
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++)
    scanf("%d", a + i);
  seg.build(1, 1, n);
  scanf("%d", &m);
  while (m--) {
    scanf("%d", &op);
    if (op == 1) {
      scanf("%d %d %d", &l, &r, &k);
      update(l, r, k);
    } else {
      scanf("%d %d", &l, &r);
      printf("%.1f\n", query(l, r));
    }
  }
  return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...