求调,怎么全是TLE
查看原帖
求调,怎么全是TLE
1220772
mossssss楼主2025/7/27 11:58
#include <bits/stdc++.h>
#define int long long
#define db double
using namespace std;
const int N=2e5+10;
int cnt=0;
struct node
{
	int l,r,lz;
	db sinm,cosm;
}nd[N*4];
int n,a[N],oqt,m,l,r,v;
void push_up(int u)
{
	nd[u].sinm+=nd[u*2].sinm+nd[u*2+1].sinm;
	nd[u].cosm+=nd[u*2].cosm+nd[u*2+1].cosm;
}

db shc(int a,int b)
{return nd[a].sinm*cos(b)+nd[a].cosm*sin(b);}
db chc(int a,int b)
{return nd[a].cosm*cos(b)-nd[a].sinm*sin(b);}

void push_down(int u)
{
	if(!nd[u].lz)return;
	int lz=nd[u].lz;
	nd[u*2].lz+=lz;
	nd[u*2+1].lz+=lz;
	nd[u*2].sinm=shc(u*2,lz);
	nd[u*2].cosm=chc(u*2,lz);
	nd[u*2+1].sinm=shc(u*2+1,lz);
	nd[u*2+1].cosm=chc(u*2+1,lz);
	nd[u].lz=0;
}
void build(int l,int r,int u)
{
	nd[u].l=l,nd[u].r=r;
	nd[u].cosm=nd[u].sinm =nd[u].lz=0; 
	if(l==r)
	{nd[u].sinm=sin(a[l]);
	nd[u].cosm=cos(a[l]);return ;}
	int mid=(l+r)>>1;
	build(l,mid,u*2);
	build(mid+1,r,u*2+1);
	push_up(u);
}
void change(int l,int r,int v,int u)
{
	if(nd[u].l>=l&&nd[u].r<=r){
		nd[u].lz+=v;
		nd[u].sinm=shc(u,v);
		nd[u].cosm=chc(u,v); 
		return;
	}
	push_down(u);
	int mid=(nd[u].l+nd[u].r)>>1;
	if(mid>=l)change(l,r,v,u*2);
	if(mid<r) change(l,r,v,u*2+1);
	push_up(u);
}
db query(int l,int r,int u)
{
	
	if(nd[u].l>=l&&nd[u].r<=r)
	{
		return nd[u].sinm;
	}db ans=0;
	push_down(u);
	int mid=(nd[u].l+nd[u].r)>>1;
	if(mid>=l)ans+=query(l,r,u*2);
	if(mid<r)ans+=query(l,r,u*2+1);
	return ans;
}
signed main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	cin>>a[i];
	build(1,n,1);
	cin>>m;
	while(m--)
	{
		cin>>oqt>>l>>r;
		if(oqt==1)
		{
			cin>>v;
			change(l,r,v,1);
		}
		else
		{
			printf("ans:%.1lf\n",query(l,r,1));
		}
	}
	return 0;
}

这是用线段树的方法来做,使用结构体来存储每个点的信息,可是交上去全是TLE,而且样例的第三个输出也是-1.7,本人是蒟蒻,真的调不动了,求助

2025/7/27 11:58
加载中...