样例通过,全WA求助
查看原帖
样例通过,全WA求助
502758
ForMyDream楼主2022/7/8 11:29
#include<iostream>
#include<cmath>
#include<cstdio>
#include<iomanip>
#define int long long
using namespace std;
#define maxn 200001
#define lson i<<1
#define rson i<<1|1
#define Pi 3.1415926 

struct node{
	int l,r,sum;
	double sinx,cosx;
	//维护左边界 右边界 区间sin cos和 
	int lazy;
}tree[maxn<<2];
int n,m;
int a[maxn];//开int也可 

void Build(int i,int l,int r){
	//建树 
	tree[i].l=l,tree[i].r=r;
	if (l==r){
//		tree[i].sum=a[l];
		tree[i].sinx=sin(a[l]);
		//若达到叶子节点 更新sin值 
		tree[i].cosx=cos(a[l]);
		return;
	}
	int mid=(l+r)/2;
	Build(lson,l,mid);
	Build(rson,mid+1,r);
//	tree[i].sum =tree[lson].sum+tree[rson].sum;
	tree[i].sinx=tree[lson].sinx+tree[rson].sinx;
	tree[i].cosx=tree[lson].cosx+tree[rson].cosx;
}

void PushDown(int i){
	if (tree[i].lazy){
		//这里的lazy就相当于x辣 
		int lazy=tree[i].lazy;
		double y =tree[lson].sinx;
		double y2=tree[rson].sinx;
		double z =tree[lson].cosx;
		double z2=tree[rson].cosx;
		tree[lson].sinx=sin(lazy)*z+cos(lazy)*y;
		tree[rson].sinx=sin(lazy)*z2+cos(lazy)*y2;
		tree[lson].cosx=cos(lazy)*z-sin(lazy)*y;
		tree[rson].cosx=cos(lazy)*z2-sin(lazy)*y2;
		tree[lson].lazy+=lazy;
		tree[rson].lazy+=lazy;
		tree[i].lazy=0;
	}
}

void Update(int i,int l,int r,double v){
	//将l~r区间分别加上v (v就相当于上面的x)
	if (tree[i].l>=l&&tree[i].r<=r){
//		tree[i].sum+=v*(tree[i].r-tree[i].l+1);
		tree[i].lazy+=v;
		//懒惰标记 
		double y=tree[i].sinx;
		double z=tree[i].cosx;
		tree[i].sinx=sin(v)*z+cos(v)*y;
		tree[i].cosx=cos(v)*z-sin(v)*y; 
		//证明的过程在最上面QAQ 
		return; //记得返回 
	}
//	PushDown(i);
	int mid=(tree[i].l+tree[i].r)/2;
	if (l<=mid) Update(lson,l,r,v);
	if (r>mid)  Update(rson,l,r,v);
//	tree[i].sum=tree[lson].sum+tree[rson].sum; 
	tree[i].sinx=tree[lson].sinx+tree[rson].sinx;
	tree[i].cosx=tree[lson].cosx+tree[rson].cosx;
}

double Query(int i,int l,int r){
	if (tree[i].l>=l&&tree[i].r<=r){
		return tree[i].sinx;
	} 
	PushDown(i);
	double val=0;
	int mid=(tree[i].l+tree[i].r)/2;
	if (l<=mid){
//		cout<<lson <<"aa\n";
		val+=Query(lson,l,r);
	} 
	if (r>mid){
//		cout<<(rson)<<"bb\n";
		val+=Query(rson,l,r);
	} 
	return val;
}

signed main(){
//	int a;cin>>a;
//	double b=sin(a);
//	cout<<fixed<<setprecision(1)<<b;
	cin>>n;
	for (int i=1;i<=n;i++) cin>>a[i];
	Build(1,1,n);
	cin>>m;
	int op,l,r;
	double v;
	for (int in=1;in<=m;in++){
		cin>>op>>l>>r;
		if (op==1){
			cin>>v;
			Update(1,l,r,v);
		}
		if (op==2){
			double ans=Query(1,l,r);
			cout<<fixed<<setprecision(1)<<ans<<endl;
		}
	}
	return 0;
}

rt,样例过了,自己造了几组数据和tj的输出也是一样的,但是全WA,求助dalao

2022/7/8 11:29
加载中...