社区讨论
刚学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 条回复,欢迎继续交流。
正在加载回复...