求调,卡了好几天了
查看原帖
求调,卡了好几天了
484586
vicissitudes楼主2024/5/2 09:01
#include<bits/stdc++.h>
#define int long long
using namespace std;

const int N = 3e5 + 10;
int n, m;
struct node {
	int l, r, dat;
	double Sin, Cos;
	long long lst;
}tr[N * 4];

int a[N];

void pushup(int &p) {
	node &left = tr[p * 2], &right = tr[p * 2 + 1];
	tr[p].dat = left.dat + right.dat;
	tr[p].Sin = left.Sin + right.Sin;
	tr[p].Cos = left.Cos + right.Cos;
}

void pushdown(node &p, node &left, node &right) {
	if(!p.lst) return ;
	left.lst += p.lst, right.lst += p.lst;
	p.dat += (p.r - p.l + 1) * p.lst;
	double Sin = p.Sin, Cos = p.Cos;
	p.Sin = cos(p.lst) * Sin + sin(p.lst) * Cos;
	p.Cos = cos(p.lst) * Cos - sin(p.lst) * Sin;
	p.lst = 0;
}

void pushdown(int &p) {
	pushdown(tr[p], tr[p * 2], tr[p * 2 + 1]);
}

void build(int p, int l, int r) {
	if(l == r) tr[p] = {l, r, a[l], sin(a[l]), cos(a[l])};
	else {
		tr[p].l = l, tr[p].r = r;
		int mid = l + r >> 1;
		build(p * 2, l, mid);
		build(p * 2 + 1, mid + 1, r);
		pushup(p);
	}
}

void change(int p, int l, int r, long long v) {
	if(tr[p].l >= l && tr[p].r <= r) {
		tr[p].lst += v;
		double sina = sin(v);
		double cosa = cos(v);
		double Sin = tr[p].Sin, Cos = tr[p].Cos;
		tr[p].Sin = cosa * Sin + sina * Cos;
		tr[p].Cos = cosa * Cos - sina * Sin;
		return ;
	} else {
		pushdown(p);
		int mid = tr[p].l + tr[p].r >> 1;
		if(mid >= l) change(p * 2, l, r, v);
		if(mid < r) change(p * 2 + 1, l, r, v);
		pushup(p);
	}
}

double query(int p, int l, int r) {
 	if(tr[p].l >= l && tr[p].r <= r) return tr[p].Sin;
	pushdown(p);
	int mid = tr[p].l + tr[p].r >> 1;
	double sum = 0;
	if(mid >= l) sum += query(p * 2, l, r);
	if(mid < r) sum += query(p * 2 + 1, l, r);
	return sum;
}

signed main() {
	cin >> n;
	for(int i = 1; i <= n; i ++) {
		cin >> a[i];
	}
	build(1, 1, n);
	cin >> m;
	while(m --) {
		int op;
		scanf("%lld", &op);
		if(op == 1) {
			int l, r, v;
			scanf("%lld%lld%lld", &l, &r, &v);
			change(1, l, r, v);		
		} else {
			int l, r;
			scanf("%lld%lld", &l, &r);
			printf("%.1lf\n", query(1, l, r));
		}
	}
	return 0;
}```
2024/5/2 09:01
加载中...