社区讨论

刚学OI eps秒萌新求调TLE 0pts

P6327区间加区间 sin 和参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mivb68w1
此快照首次捕获于
2025/12/07 13:55
2 个月前
此快照最后确认于
2025/12/10 12:45
2 个月前
查看原帖
strange!
C
#include<bits/stdc++.h>
using namespace std;
#define int long double
const long long N=2e5+5;
int a[N];
struct Node
{
	int S,C;
}sgt[N<<2];
int lazy_tag[N<<2];
int Sinplus(int Sina,int Sinb,int Cosa,int Cosb)
{
	return Sina*Cosb+Cosa*Sinb;
}
int Cosplus(int Sina,int Sinb,int Cosa,int Cosb)
{
	return Cosa*Cosb-Sina*Sinb;
}
void f(int &SSin,int &CCos,int k)
{
	int Sin=SSin,Cos=CCos; 
	SSin=Sinplus(Sin,sin(k),Cos,cos(k));
	CCos=Cosplus(Sin,sin(k),Cos,cos(k));
}
void pushdown(long long x,long long l,long long r)
{
	long long mid=l+r>>1;
	f(sgt[x<<1].S,sgt[x<<1].C,lazy_tag[x]);
	lazy_tag[x<<1]+=lazy_tag[x];
	f(sgt[x<<1|1].S,sgt[x<<1|1].C,lazy_tag[x]);
	lazy_tag[x<<1|1]+=lazy_tag[x];
	lazy_tag[x]=0;
}
void build(long long x,long long l,long long r)
{
	if(l==r)
	{
		sgt[x].S=sin(a[l]);
		sgt[x].C=cos(a[l]);
		return;
	}
	long long mid=l+r>>1;
	build(x<<1,l,mid);
	build(x<<1|1,mid+1,r);
	sgt[x].S=sgt[x<<1].S+sgt[x<<1|1].S;
	sgt[x].C=sgt[x<<1].C+sgt[x<<1|1].C;
}
int query(long long x,long long l,long long r,long long L,long long R)
{
	if(l>=L&&R>=r) return sgt[x].S;
	pushdown(x,l,r);
	long long mid=l+r>>1;
	int ans=0;
	if(L<=mid) ans+=query(x<<1,l,mid,L,R);
	if(R>mid) ans+=query(x<<1|1,mid+1,r,L,R);
	sgt[x].S=sgt[x<<1].S+sgt[x<<1|1].S;
	sgt[x].C=sgt[x<<1].C+sgt[x<<1|1].C;
	return ans;
}
void update(long long x,long long l,long long r,long long L,long long R,long long k)
{
	if(l>=L&&R>=r)
	{
		lazy_tag[x]+=k;
		f(sgt[x].S,sgt[x].C,k);
		return;
	}
	long long mid=l+r>>1;
	pushdown(x,l,r);
	if(L<=mid) update(x<<1,l,mid,L,R,k); 
	if(R>mid) update(x<<1|1,mid+1,r,L,R,k); 
	sgt[x].S=sgt[x<<1].S+sgt[x<<1|1].S;
	sgt[x].C=sgt[x<<1].C+sgt[x<<1|1].C;
}
signed main()
{
	cin.tie(0)->sync_with_stdio(0);
	int n;
	cin>>n;
	for(long long i=1;i<=n;i++) cin>>a[i];
	build(1,1,n);
	//for(long long i=1;i<=n;i++) printf("%Lf ",query(1,1,n,i,i));
	int m;
	cin>>m;
	while(m--)
	{
		int op;
		cin>>op;
		if(op==1)
		{
			int x,y,k;
			cin>>x>>y>>k;
			update(1,1,n,x,y,k);
		}
		else
		{
			int x,y;
			cin>>x>>y;
		//	printf("%Lf ",query(1,1,n,x,y));
			int ans=query(1,1,n,x,y);
			if(ans<=0) ans-=0.05;
			else ans+=0.05;
			printf("%0.1Lf\n",(int)((long long)(ans*10))/10);
		}
	//	for(long long i=1;i<=n;i++) printf("%Lf ",query(1,1,n,i,i));
	//	printf("\n");
	} 
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...