P6327 区间加区间 sin 和 题解
维护一个点的
往点里面加入一个值
分析代码是否需要维护区间个数:
假设
首先有
那么区间加入
所以只需要往节点里面加
配合模板,主要代码为
using Info = std::array<double, 2>;
/* sin cos */
using Function = i64;
auto mapping = [&](Function f, Info x) -> Info {
return Info{x[0] * std::cos(f) + x[1] * std::sin(f), x[1] * std::cos(f) - x[0] * std::sin(f)};
};
auto composition = [&](Function f, Function g) -> Function {
return f + g;
};
auto op = [&](Info lhs, Info rhs) -> Info {
return Info{lhs[0] + rhs[0], lhs[1] + rhs[1]};
};
auto e = [&]() -> Info {
return Info{0, 0};
};
auto id = [&]() -> Function {
return Function{0};
};
unsigned n;
std::cin >> n;
SegmentTree::LazySegTree<Info, Function, mapping, composition, op, e, id> seg(n, [&](auto ...) {
Info x;
int a;
std::cin >> a;
x[0] = std::sin(a);
x[1] = std::cos(a);
return x;
});