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