这里整合了一下讨论区的大量警示后人
long long
见祖宗double
,不然 cos 和 sin 会问题printf
的性质(如下附2)double
附1
我猜测你肯定是写成这个 pushdown
和这个 update
的
void pushdown(int u){
if(seg[u].lay==0) return ;
seg[u<<1].lay+=seg[u].lay;
seg[u<<1|1].lay+=seg[u].lay;
seg[u<<1].s=seg[u<<1].s*cos(seg[u].lay)+seg[u<<1].c*sin(seg[u].lay);
seg[u<<1|1].s=seg[u<<1|1].s*cos(seg[u].lay)+seg[u<<1|1].c*sin(seg[u].lay);
seg[u<<1].c=seg[u<<1].c*cos(seg[u].lay)-seg[u<<1].s*sin(seg[u].lay);
seg[u<<1|1].c=seg[u<<1|1].c*cos(seg[u].lay)-seg[u<<1|1].s*sin(seg[u].lay);
seg[u].lay=0;
return ;
}
void update(int u,int l,int r,int ql,int qr,int v){
if(ql>r||qr<l) return ;
if(ql<=l&&r<=qr){
seg[u].s=seg[u].s*cos(v)+seg[u].c*sin(v);
seg[u].c=seg[u].c*cos(v)-seg[u].s*sin(v);
seg[u].lay+=v;
return ;
}
pushdown(u);
int mid=(l+r)>>1;
if(ql<=mid) update(u<<1,l,mid,ql,qr,v);
if(mid<qr) update(u<<1|1,mid+1,r,ql,qr,v);
pushup(u);
return ;
}
那你就错了,cos 和 sin 都要保存之前的进行计算,应该写成下面那样
void pushdown(int u){
if(seg[u].lay==0) return ;
seg[u<<1].lay+=seg[u].lay;
seg[u<<1|1].lay+=seg[u].lay;
oldsin=seg[u<<1].s;
oldcos=seg[u<<1].c;
seg[u<<1].s=oldsin*cos(seg[u].lay)+oldcos*sin(seg[u].lay);
seg[u<<1].c=oldcos*cos(seg[u].lay)-oldsin*sin(seg[u].lay);
oldsin=seg[u<<1|1].s;
oldcos=seg[u<<1|1].c;
seg[u<<1|1].s=oldsin*cos(seg[u].lay)+oldcos*sin(seg[u].lay);
seg[u<<1|1].c=oldcos*cos(seg[u].lay)-oldsin*sin(seg[u].lay);
seg[u].lay=0;
return ;
}
void update(int u,int l,int r,int ql,int qr,int v){
if(ql>r||qr<l) return ;
if(ql<=l&&r<=qr){
oldsin=seg[u].s;
oldcos=seg[u].c;
seg[u].s=oldsin*cos(v)+oldcos*sin(v);
seg[u].c=oldcos*cos(v)-oldsin*sin(v);
seg[u].lay+=v;
return ;
}
pushdown(u);
int mid=(l+r)>>1;
if(ql<=mid) update(u<<1,l,mid,ql,qr,v);
if(mid<qr) update(u<<1|1,mid+1,r,ql,qr,v);
pushup(u);
return ;
}
附2
你如果是这样写的是取整的意思,应该用 printf
或者别的写法
(int)(x*10+0.5)/10.0