样例过了,全RE,求调玄关
查看原帖
样例过了,全RE,求调玄关
324226
X2H_tato楼主2024/8/13 11:11
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
int n;
int a[N];
double sinv,cosv;

struct st{
	double tsin[N<<2],tcos[N<<2];
	long long tag[N<<2];
	void push_up (int p)
	{
		tsin[p]=tsin[p<<1|1]+tsin[p<<1];
		tcos[p]=tcos[p<<1|1]+tcos[p<<1];
	}
	void build (int l,int r,int p)
	{
		if(l==r)
		{
			tsin[p]=sin(a[l]);
			tcos[p]=cos(a[l]);
			return ;
		}
		int mid=(l+r)>>1;
		build(l,mid,p<<1);
		build(mid+1,r,p<<1|1);
		push_up(p);
	}
	void sdown (int p,double sinp,double cosp,int k)
	{
		tsin[p]=tcos[p]*sinp+tsin[p]*cosp;
		tcos[p]=tcos[p]*cosp-tsin[p]*sinp;
		tag[p]+=k;
	}
	void push_down (int u)
	{
		if(abs(tag[u]-0)<0.000001) return ;
		sdown(u<<1,sin(tag[u]),cos(tag[u]),tag[u]);
		sdown(u<<1|1,sin(tag[u]),cos(tag[u]),tag[u]);
		tag[u]=0;
	}
	void update (int l,int r,int pl,int pr,int p,int k)
	{
		if(pl<=l&&r<=pr) 
		{
			
			sdown(p,sinv,cosv,k);
			return ;
		}
		int mid=(l+r)>>1;
		push_down(p);
		if(pl<=mid)	update(1,mid,pl,pr,p<<1,k);
		if(pr>mid) update(mid+1,r,pl,pr,p<<1|1,k);
		push_up(p);
	}
	double query (int l,int r,int pl,int pr,int p)
	{
		
		double res=0.0;
		if(pl<=l&&r<=pr) return tsin[p];//cout<<"@";
		int mid=(l+r)>>1;//cout<<p<<" "<<l<<" "<<mid<<" "<<r<<" "<<pl<<" "<<pr<<" "<<endl;
		push_down(p);
		if(pl<=mid) res+=query(l,mid,pl,pr,p<<1);
		if(pr>mid) res+=query(mid+1,r,pl,pr,p<<1|1);
		
		return res;
	}
}T;

signed main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)	
		scanf("%d",&a[i]);
	T.build(1,n,1);
	int m;
	scanf("%d",&m);
	while(m--)
	{
		int op;
		cin>>op;
		if(op==1)
		{
			int l,r,v;
			scanf("%lld%lld%lld",&l,&r,&v);
			sinv=sin(v),cosv=cos(v);
			//cout<<sinv<<" "<<cosv<<endl;
			T.update(1,n,l,r,1,v);
			
		}
		else
		{
			int l,r;
			scanf("%lld%lld",&l,&r);
			printf("%.1f\n",T.query(1,n,l,r,1));
//			for(int i=1;i<=n*4;i++)
//				cout<<T.tsin[i]<<" ";
//				puts("");
		}
	}
	return 0;	
} 

define int long long应该没事吧

2024/8/13 11:11
加载中...