蒟蒻求助 样例过了 全WA
查看原帖
蒟蒻求助 样例过了 全WA
1206518
Nervegas楼主2024/8/8 20:22
#include<bits/stdc++.h>
using namespace std;
const int N = 3e5;
int n;
int a[N];
int m;
double sv,cv;
struct tree{
	long long l,r,lazy;
	double sinsum,cossum;
}tr[N << 3];
void update(int p,double sc,double cc){
	double sp = tr[p].sinsum;
	double cp = tr[p].cossum;
	tr[p].sinsum = sp * cc + cp * sc;
	tr[p].cossum = cp * cc - sp * sc;
}
void build(int l,int r,int p){
	tr[p].l = l;
	tr[p].r = r;
	if(l != r){
		int mid = (l + r) / 2;
	    build(l,mid,p * 2);
	    build(mid + 1,r,p * 2 + 1);
	    tr[p].sinsum = tr[p * 2].sinsum + tr[p * 2 + 1].sinsum;
	    tr[p].cossum = tr[p * 2].cossum + tr[p * 2 + 1].cossum;
	}
	else{
		tr[p].sinsum = sin(a[l]);
		tr[p].cossum = cos(a[r]);
	}
}
void lazy_down(int p){
	long long la = tr[p].lazy;
	if(!la){
		return;
	}
	double sla = sin(la);
	double cla = cos(la);
	update(p * 2,sla,cla);
	tr[p * 2].lazy += la;
	update(p * 2 + 1,sla,cla);
	tr[p * 2 + 1].lazy += la;
	la = 0;
}
void add(int p,int l,int r,int x){
	if(tr[p].l > r || tr[p].r < l){
		return;
	}
	if(tr[p].l >= l && tr[p].r <= r){
		update(p,sv,cv);
		tr[p].lazy += x;
		return; 
	}
	lazy_down(p);
	add(p * 2,l,r,x);
	add(p * 2 + 1,l,r,x);
	tr[p].sinsum = tr[p * 2].sinsum + tr[p * 2 + 1].sinsum;
	tr[p].cossum = tr[p * 2].cossum + tr[p * 2 + 1].cossum;
}
double query(int p,int l,int r){
	if(l <= tr[p].l && r >= tr[p].r){
		return tr[p].sinsum;
	}
	if(tr[p].l > r || tr[p].r < l){
		return 0;
	}
	lazy_down(p);
	return query(p * 2,l,r) + query(p * 2 + 1,l,r);
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0);
	cin >> n;
	for(int i = 1 ; i <= n ; i++){
		cin >> a[i];
	}
	build(1,n,1);
	cin >> m;
	while(m--){
		int op,l,r,v;
		cin >> op;
		if(op == 1){
			cin >> l >> r >> v;
			sv = sin(v);
			cv = cos(v);
			add(1,l,r,v);
		}
		else{
			cin >> l >> r;
			printf("%.1lf\n", query(1, l, r));
		}
	}
	return 0; 
}
2024/8/8 20:22
加载中...