社区讨论
全 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 条回复,欢迎继续交流。
正在加载回复...