样例不过,求助!
查看原帖
样例不过,求助!
1033990
lw393楼主2024/8/9 12:19
#include<iostream>
#include<iomanip>
#include<cmath> 
using namespace std;
const int N = 2e5 + 5;

double a[N];

struct node{
	int l, r;
	double tag;
	double sum_sin, sum_cos;
}tree[N << 2];

void pushup(int k){
	int lc = k * 2;
	int rc = k * 2 + 1;
	tree[k].sum_sin = tree[lc].sum_sin + tree[rc].sum_sin;
	tree[k].sum_cos = tree[lc].sum_cos + tree[rc].sum_cos;
}

void add_tag(int k, double v){
	int ssin = tree[k].sum_sin;
	int scos = tree[k].sum_cos;
	tree[k].tag += v;
	tree[k].sum_sin = cos(v) * ssin + sin(v) * scos;
	tree[k].sum_cos = cos(v) * scos - sin(v) * ssin;
}

void pushdown(int k){
	int lc = k * 2;
	int rc = k * 2 + 1;
	add_tag(lc, tree[k].tag);
	add_tag(rc, tree[k].tag);
	tree[k].tag = 0;
}

void build(int k, int l, int r){
	tree[k].l = l;
	tree[k].r = r;
	if(l == r){
		tree[k].sum_sin = sin(a[l]);
		tree[k].sum_cos = cos(a[l]);
		//cout << l << ' ' << tree[k].sum_sin << ' ' << tree[k].sum_cos << '\n';
		return;
	}
	int mid = (l + r) >> 1;
	int lc = k * 2;
	int rc = k * 2 + 1;
	build(lc, l, mid);
	build(rc, mid + 1, r);
	pushup(k);
}

void modify(int k, int l, int r, double v){
	if(tree[k].l >= l && tree[k].r <= r){
		add_tag(k, v);
		return;
	}
	pushdown(k);
	int mid = (tree[k].l + tree[k].r) >> 1;
	int lc = k * 2;
	int rc = k * 2 + 1;
	if(r <= mid) modify(lc, l, r, v);
	else if(l > mid) modify(rc, l, r, v);
	else modify(lc, l, mid, v), modify(rc, mid + 1, r, v);
	pushup(k);
}

double query(int k, int l, int r){
	if(tree[k].l >= l && tree[k].r <= r) return tree[k].sum_sin;
	pushdown(k);
	int mid = (tree[k].l + tree[k].r) >> 1;
	int lc = k * 2;
	int rc = k * 2 + 1;
	if(r <= mid) return query(lc, l, r);
	else if(l > mid) return query(rc, l, r);
	else return query(lc, l, mid) + query(rc, mid + 1, r);
}

void solve(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cout << fixed << setprecision(1);
	int n;
	cin >> n;
	for(int i = 1; i <= n; i++) cin >> a[i];
	build(1, 1, n);
	int m;
	cin >> m;
	for(int i = 1; i <= m; i++){
		int op, l, r;
		cin >> op >> l >> r;
		if(op == 1){
			double v;
			cin >> v; 
			modify(1, l, r, v);
		}else{
			cout << query(1, l, r) << '\n';
		}
		/*for(int i = 1; i <= (n << 2); i++){
			cout << tree[i].l << ' ' << tree[i].r << ' ' << tree[i].sum_sin << ' ' << tree[i].sum_sin << '\n';
		}*/
		
	}
}

int main(){
	int t = 1;
	//cin >> t;
	while(t--){
		solve();
	}
	return 0;
}

2024/8/9 12:19
加载中...