样例过了但是全waQAQ
查看原帖
样例过了但是全waQAQ
1160836
Linear_L楼主2024/3/6 18:31
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=2e5+10;
int a[maxn];
int l,r,op;

struct tree
{
	int l,r;
	double s;
	double c; 
	int lzy;
}tr[maxn<<2];

void pushup(int p)
{
	tr[p].s=tr[p<<1].s+tr[p<<1|1].s;
	tr[p].c=tr[p<<1].c+tr[p<<1|1].c;
}

void build(int p,int l,int r)
{
	tr[p].l=l;
	tr[p].r=r;
	tr[p].lzy=0;
	if(l==r)
	{
		tr[p].s=sin(a[l]);
		tr[p].c=cos(a[l]);
		return ;
	}
	int mid=(l+r)>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	pushup(p);
}

void update(int p,double sina,double cosa)
{
	double sinu=tr[p].s;
	double cosu=tr[p].c;
	tr[p].s=sinu*cosa+cosu*sina;
	tr[p].c=cosu*cosa-sina*sinu;
}

void pushdown(int p)
{
	if(tr[p].lzy)
	{
		double sina=sin(tr[p].lzy);
		double cosa=cos(tr[p].lzy);
		update(p<<1,sina,cosa);
		update(p<<1|1,sina,cosa);
		tr[p<<1].lzy+=tr[p].lzy;
		tr[p<<1|1].lzy+=tr[p].lzy;
		tr[p].lzy=0;
	}
}

void modify(int p,int l,int r,int k)
{
	if(tr[p].l>=l&&tr[p].r<=r)
	{
		tr[p].lzy+=k;
		double sina=sin(k);
		double cosa=cos(k);
		update(p,sina,cosa);
		return ;
	}
	pushdown(p);
	int mid=(tr[p].l+tr[p].r)>>1;
	if(l<=mid) modify(p<<1,l,r,k);
	if(r>mid) modify(p<<1|1,l,r,k);
	pushup(p);
}

void modify1(int p,int k,int x)
{
	if(tr[p].l==tr[p].r)
	{
		tr[p].lzy+=x;
		double sina=sin(x);
		double cosa=cos(x);
		update(p,sina,cosa);
		return ;
	}
	pushdown(p);
	int mid=(tr[p].l+tr[p].r)>>1;
	if(k<=mid) modify1(p<<1,k,x);
	else modify1(p<<1|1,k,x);
	pushup(p);
}

double query(int p,int l,int r)
{
	if(tr[p].l>=l&&tr[p].r<=r) return tr[p].s;
	int mid=(tr[p].l+tr[p].r)>>1;
	double res=0;
	if(l<=mid) res+=query(p<<1,l,r);
	if(r>mid) res+=query(p<<1|1,l,r);
	return res;
}

double query1(int p,int k)
{
	if(tr[p].l==tr[p].r) return tr[p].s;
	int mid=tr[p].l+tr[p].r>>1;
	double res=0;
	if(k<=mid) res=query1(p<<1,k);
	else res=query1(p<<1|1,k);
	return res;
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	
	int n,m;
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	build(1,1,n);
	cin>>m;
	while(m--)
	{
		cin>>op>>l>>r;
		if(op==1) 
		{
			int k;
			cin>>k;
			if(l==r) modify1(1,l,k);
			else modify(1,l,r,k);
		}
		else
		{
			if(l==r) printf("%.1f\n",query1(1,l));
			else printf("%.1f\n",query(1,l,r));
		}
	}
	
	return 0;
}
2024/3/6 18:31
加载中...