社区讨论

弘文了过样例 0pts 所有讨论区帖子均已查看过 求助

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

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@mjbao0rc
此快照首次捕获于
2025/12/18 18:25
3 个月前
此快照最后确认于
2025/12/20 17:45
3 个月前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 8e5 + 5;
int a[N], tag[N]; double s[N], c[N];
void pushup(int x) {
	s[x] = s[x*2] + s[x*2+1];
	c[x] = c[x*2] + c[x*2+1];
} void pushdown(int x, int l, int r) {
	if(!tag[x]) return ;
	tag[x*2] += tag[x]; tag[x*2+1] += tag[x];
	double p = s[x*2], q = c[x*2];
	s[x*2] = p * cos(tag[x]) + q * sin(tag[x]);
	c[x*2] = q * cos(tag[x]) - p * sin(tag[x]);
	p = s[x*2+1], q = s[x*2+1];
	s[x*2+1] = p * cos(tag[x]) + q * sin(tag[x]);
	c[x*2+1] = q * cos(tag[x]) - p * sin(tag[x]);
	tag[x] = 0;
} void build(int x, int l, int r) {
	if(l == r) 
		return s[x] = sin(a[l]), c[x] = cos(a[l]), void();
	int mid = (l + r) >> 1;
	build(x*2, l, mid); build(x*2+1, mid+1, r);
	pushup(x);
} void update(int x, int l, int r, int L, int R, int y) {
	if(l > R || r < L) return ;
	if(L <= l && r <= R) {
		//打标记
		tag[x] += y;
		double p = s[x], q = c[x];
		s[x] = p * cos(y) + q * sin(y);
		c[x] = q * cos(y) - p * sin(y);
		return ; 
	} int mid = (l + r) >> 1;
	pushdown(x, l, r); 
	update(x*2, l, mid, L, R, y); update(x*2+1, mid+1, r, L, R, y);
	pushup(x);
} double query(int x, int l, int r, int L, int R) {
	if(r < L || l > R) return 0;
	if(L <= l && r <= R) return s[x];
	pushdown(x, l, r); int mid = (l + r) >> 1;
	double ans =  query(x*2, l, mid, L, R) + query(x*2+1, mid+1, r, L, R);
	pushup(x); return ans;
} void debug(int x, int l, int r) {
	cout << x << " " << l << " " << r << " " << s[x] << " " << c[x] << endl;
	if(l == r) return ; int mid = (l + r) >> 1; // pushdown(x, l, r);
	debug(x*2, l, mid); debug(x*2+1, mid+1, r);
} signed main() {
	int n; cin >> n;
	for(int i = 1;i <= n;i++)
		cin >> a[i];
	build(1, 1, n); int m; cin >> m;
	while(m--) { int opt, l, r, v;
		cin >> opt >> l >> r;
		if(opt == 1) cin >> v, update(1, 1, n, l, r, v);
		else cout << fixed << setprecision(1) << query(1, 1, n, l, r) << endl;
	}
	return 0;
}

回复

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

正在加载回复...