CF995C Leaving the Bar

II.CF995C Leaving the Bar

两个106的向量求和/差,是无法做到结果必在106以内的;但是,如果是三个,就可以做到了。

考虑两个向量。则只有它们的夹角在[2π3,4π3]之间时,可以做到。当有三个向量时,则至少存在一对向量满足上述要求,则可以合并。合并完后问题规模便减少1。则任意大小的答案,都可以经过合并做到只剩两个106级别的向量;取和/差中模长更小的一个答案,即可做到最终答案在1.5×106以内。

可以使用并查集维护向量合并的过程。

代码:

#include<bits/stdc++.h>
using namespace std;
const int LIM1=1000000;
const int LIM2=1500000;
int n,fa[100100],A,B;
bool rev[100100];
struct Vector{
	int x,y;
	Vector(int X=0,int Y=0){x=X,y=Y;}
	friend Vector operator +(const Vector &u,const Vector &v){return Vector(u.x+v.x,u.y+v.y);}
	friend Vector operator -(const Vector &u,const Vector &v){return Vector(u.x-v.x,u.y-v.y);}
	friend bool operator <=(const Vector &u,const int &v){return 1ll*u.x*u.x+1ll*u.y*u.y<=1ll*v*v;}
}v[100100];
int main(){
	scanf("%d",&n);
	if(n<=1){puts("1");return 0;}
	for(int i=1;i<=n;i++)scanf("%d%d",&v[i].x,&v[i].y);
	A=1,B=2;
	for(int i=3;i<=n;i++){
		if(v[i]+v[A]<=LIM1){v[i]=v[i]+v[A],fa[A]=i,A=B,B=i;continue;}
		if(v[i]-v[A]<=LIM1){v[i]=v[i]-v[A],fa[A]=i,rev[A]^=1,A=B,B=i;continue;}
		if(v[i]+v[B]<=LIM1){v[i]=v[i]+v[B],fa[B]=i,B=i;continue;}
		if(v[i]-v[B]<=LIM1){v[i]=v[i]-v[B],fa[B]=i,rev[B]^=1,B=i;continue;}
		if(v[B]+v[A]<=LIM1){v[B]=v[B]+v[A],fa[A]=B,A=B,B=i;continue;}
		if(v[B]-v[A]<=LIM1){v[B]=v[B]-v[A],fa[A]=B,rev[A]^=1,A=B,B=i;continue;}
	}
	if(v[B]+v[A]<=LIM2)v[B]=v[B]+v[A],fa[A]=B;
	else v[B]=v[B]-v[A],fa[A]=B,rev[A]^=1;
	for(int i=n;i;i--)if(fa[i])rev[i]^=rev[fa[i]];
	for(int i=1;i<=n;i++)printf("%d ",rev[i]?-1:1);
	return 0;
}

posted @   Troverld  阅读(37)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示