警示后人合集
查看原帖
警示后人合集
1015002
Charles_with_wkc楼主2025/8/31 16:00

这里整合了一下讨论区的大量警示后人

  1. 十年OI一场空,不开long long见祖宗
  2. 注意你的三角函数是咋写的
  3. 这里的三角函数要保存之前的(如下附1)
  4. 记得开 double,不然 cos 和 sin 会问题
  5. 不要误写四舍五入,其中记得思考 printf 的性质(如下附2)
  6. 请注意你求 sin 和的函数,应该是 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
2025/8/31 16:00
加载中...