(蓝桥真题)扫描游戏(计算几何+线段树二分)

news2025/7/14 21:48:02

题目链接:P8777 [蓝桥杯 2022 省 A] 扫描游戏 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

样例输入: 

5 2
0 1 1
0 3 2
4 3 5
6 8 1
-51 -33 2

样例输出:

1 1 3 4 -1

分析:先考虑如何对物件进行排序,首先,因为我们需要按序考虑该物件是否能被碰到,这个可以先对每个点进行象限划分,然后对于不同象限的我们可以直接进行排序,对于同一象限内的点我们可以通过叉积来判断先后顺序,叉积的正负代表了旋转的方向,所以这样我们就可以对所有的点进行排序。

排完序我们就可以来求在当前状态下下一个能够碰到的物件的编号,这个我们可以用线段树,那么就是每次找寻一个区间内第一个到原点距离小于等于当前棒长度的物件,这个我们可以用线段树二分去寻找,假如当前所在的物件是now,那么我们首先去物件编号为now+1~n的物件里面去寻找是否有小于等于当前棒长度的物件,如果有的话就更新当前棒的长度,然后把这个物件的距离设置为无穷大。如果没有的话就去物件编号为1~now-1的物件里面去寻找,同理,有的话就对棒的长度进行修改。如果两个区间都没有找到,那么说明所有的物件都不可能再被碰到,那么也就终止了

但不知道为什么洛谷上是有一个点过不了的,但是其他平台可过,希望有大佬能指出错误!

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
using namespace std;
typedef long long ll;
const int N=1e6+10;
int l[N],r[N];
long long mn[N];
int ans[N];
struct node{
	int id;
	ll x,y,z;
}p[N];
int find(node a)//判断该点属于哪一象限 
{
	if(a.x>=0&&a.y>0) return 1;
	else if(a.x>0&&a.y<=0) return 2;
	else if(a.x<=0&&a.y<0) return 3;
	else return 4;
}
ll mul(node a,node b)//求叉积
{
	return a.x*b.y-a.y*b.x;
}
bool cmp(node a,node b)
{
	if(find(a)!=find(b)) return find(a)<find(b);
	if(mul(a,b)==0) return a.x*a.x+a.y*a.y<b.x*b.x+b.y*b.y;
	return mul(a,b)<0;
}
void pushup(int id)
{
	mn[id]=min(mn[id<<1],mn[id<<1|1]);
}
void build(int id,int L,int R)
{
	l[id]=L;r[id]=R;mn[id]=0x3f3f3f3f3f3f3f3f;
	if(L==R)
	{
		mn[id]=(int)sqrt(1.0*p[L].x*p[L].x+p[L].y*p[L].y);
		if(mn[id]*mn[id]!=p[L].x*p[L].x+p[L].y*p[L].y) mn[id]++;
		return ;
	}
	int mid=L+R>>1;
	build(id<<1,L,mid);
	build(id<<1|1,mid+1,R);
	pushup(id);
	return ;
}
void update_point(int id,int pos,long long val)
{
	if(l[id]==r[id])
	{
		mn[id]=val;
		return ;
	}
	int mid=l[id]+r[id]>>1;
	if(pos<=mid) update_point(id<<1,pos,val);
	else update_point(id<<1|1,pos,val);
	pushup(id);
}
void query_interval(int id,int L,int R,ll val,int &pos)//在区间[L,R]中找寻第一个小于等于val的编号 
{
	if(pos) return ;
	if(l[id]==r[id])
	{
		pos=l[id];
		return ;
	}
	int mid=l[id]+r[id]>>1;
	if(mid>=L&&mn[id<<1]<=val) query_interval(id<<1,L,R,val,pos);
	if(pos) return ;
	if(mid+1<=R&&mn[id<<1|1]<=val) query_interval(id<<1|1,L,R,val,pos);
	return ;
}
int main()
{
	ll n,L;
	cin>>n>>L;
	for(int i=1;i<=n;i++)
	{
		p[i].id=i;
		scanf("%lld%lld%lld",&p[i].x,&p[i].y,&p[i].z);
		if(p[i].x==0&&p[i].y==0) L+=p[i].z,p[i].x=p[i].y=0x3f3f3f3f;
	}
	sort(p+1,p+n+1,cmp);
	build(1,1,n);
	int now=0;
	int rank=1,cnt=0;//rank记录当前应该分配的排名,cnt记录当前同排名的人数
	node last;//记录上一个排名 
	while(true)
	{
		int pos=0;
		if(now!=n)
		{
			query_interval(1,now+1,n,L,pos);
			if(pos)
			{
				L+=p[pos].z;
				if(rank==1&&cnt==0)
				{
					cnt++;
					ans[p[pos].id]=rank;
				}
				else
				{
					if(find(last)==find(p[pos])&&mul(last,p[pos])==0)
					{
						cnt++;
						ans[p[pos].id]=rank;
					}
					else
					{
						rank+=cnt;
						ans[p[pos].id]=rank;
						cnt=1;
					}
				}
				last=p[pos];
				now=pos;
				update_point(1,pos,0x3f3f3f3f3f3f3f3f); 
				continue;
			}
		}
		if(now!=1&&now)
		{
			query_interval(1,1,now-1,L,pos);
			if(pos)
			{
				L+=p[pos].z;
				if(rank==1&&cnt==0)
				{
					cnt++;
					ans[p[pos].id]=rank;
				}
				else
				{
					if(find(last)==find(p[pos])&&mul(last,p[pos])==0)
					{
						cnt++;
						ans[p[pos].id]=rank;
					}
					else
					{
						rank+=cnt;
						ans[p[pos].id]=rank;
						cnt=1;
					}
				}
				last=p[pos];
				now=pos;
				update_point(1,pos,0x3f3f3f3f3f3f3f3f); 
				continue;
			}
		}
		break;
	}
	for(int i=1;i<=n;i++)
		if(ans[i]) printf("%d ",ans[i]);
		else printf("-1 ");
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/396025.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【PSO-PID】使用粒子群算法整定PID参数控制起动机入口压力值

最近在学优化算法&#xff0c;接触到了经典寻优算法之粒子群PSO&#xff0c;然后就想使用PSO算法来调节PID参数&#xff0c;在试验成功之后将此控制算法应用到了空气起动系统上&#xff0c;同时与之前的控制器进行对比看看哪种控制效果最好。 0 引言 PID参数整定主要有两种&…

谁说程序员不懂了浪费,女神节安排

Python的PyQt框架的使用一、前言二、女神节文案三、浪漫的代码四、官宣文案一、前言 个人主页: ζ小菜鸡大家好&#xff0c;我是ζ小菜鸡&#xff0c;特在这个特殊的日子献上此文&#xff0c;希望小伙伴们能讨自己的女神欢心。 二、女神节文案 1.生活一半是柴米油盐&#xff0c…

优化设计流程的“闭环”问题

7.优化设计流程的“闭环”问题 交互设计师有一项很重要的工作就是定义任务流程。在接到需求之后&#xff0c;设计师需要把抽象的需求设计成具象的流程&#xff0c;然后再把流程分配到不同的界面&#xff0c;最终形成成品。设计流程不难&#xff0c;但是设计好的流程非常难&…

VisualStudio2022制作多项目模板及Vsix插件

一、安装工作负载 在vs2022上安装“visual studio扩展开发 ”工作负载 二、制作多项目模板 导出项目模板这个我就不再多说了&#xff08;项目→导出模板→选择项目模板&#xff0c;选择要导出的项目→填写模板信息→完成&#xff09;。 1.准备模板文件 将解决方案中的多个…

SpringBoot整合ElasticSearch实现模糊查询,排序,分页,高亮

目录 前言 1.框架集成-SpringData-整体介绍 1.1Spring Data Elasticsearch 介绍 2.框架集成Spring Data Elasticsearch 2.1版本说明 2.2.idea创建一个springboot项目 2.3.导入依懒 2.3.增加配置文件 2.4Spring Boot 主程序。 2.5.数据实体类 2.6.配置类 2.7.DAO 数据…

速卖通、亚马逊、ebay打造爆款,借助测评自养号提高转化率

做速卖通、亚马逊、ebay只有打造爆款&#xff0c;才能够挣到钱&#xff0c;如果一年到头&#xff0c;不断测款&#xff0c;不断测试不同的广告打法&#xff0c;那么代表了什么&#xff1f;代表了你的试错成本相当高&#xff0c;一不小心&#xff0c;分分钟就能够把手头上仅有的…

【YOLOv8/YOLOv7/YOLOv5/YOLOv4/Faster-rcnn系列算法改进NO.57】引入可形变卷积

文章目录前言一、解决问题二、基本原理三、​添加方法四、总结前言 作为当前先进的深度学习目标检测算法YOLOv8&#xff0c;已经集合了大量的trick&#xff0c;但是还是有提高和改进的空间&#xff0c;针对具体应用场景下的检测难点&#xff0c;可以不同的改进方法。此后的系列…

SRP合批问题

1&#xff09;SRP合批问题 ​2&#xff09;多个Base相机渲染到同一个渲染目标&#xff0c;移动平台花屏的问题 3&#xff09;粒子系统对GPU Instancing的支持 4&#xff09;如何修改URP下场景和UI分辨率分离&#xff08;不需要改颜色空间&#xff09; 这是第327篇UWA技术知识分…

苹果新专利实现无线技术传输睡眠数据,蓝牙在智能家居中的应用

苹果于 2017 年 5 月收购了芬兰科技公司 Beddit&#xff0c;只是在过去 6 年时间里并没有太大的动作。根据美国商标和专利局本周公示的清单&#xff0c;苹果获得了一项 Beddit 相关的技术专利。 根据专利描述&#xff0c;苹果使用一根或者多根天线&#xff0c;利用电磁辐射的…

详解Java8中如何通过方法引用获取属性名/::的使用

在我们开发过程中常常有一个需求&#xff0c;就是要知道实体类中Getter方法对应的属性名称&#xff08;Field Name&#xff09;&#xff0c;例如实体类属性到数据库字段的映射&#xff0c;我们常常是硬编码指定 属性名&#xff0c;这种硬编码有两个缺点。 1、编码效率低&#x…

Simulink 自动代码生成电机控制:在某国产ARM0定点MCU上实现自动代码生成无感电机控制

目录 前言 开发流程 定点化的技巧 代码生成运行演示 总结 前言 这次尝试了在国产arm0内核的MCU上实现Simulink自动代码生成永磁同步电机无传感控制。机缘巧合之下拿到了一块国产MCU的电机控制板和一个5000RPM的小电机。最后实现了无传感控制&#xff0c;在这里总结下一些经…

10.系统级I/O

1.基础所有的I/O设备被模型化为文件&#xff0c;所有的输入和输出被当作相应文件的读和写来执行应用程序在文件结尾检测到EOF(end of file)条件文本文件是只含有ASCII或Unicode字符的普通文件二进制文件是所有的其他文件对于内核&#xff0c;文本文件和二进制文件没有区别目录是…

女神节灯笼祝福【HTML+CSS】

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

STM32F103驱动LD3320语音识别模块

STM32F103驱动LD3320语音识别模块LD3320语音识别模块简介模块引脚定义STM32F103ZET6开发板与模块接线测试代码实验结果LD3320语音识别模块简介 基于 LD3320&#xff0c;可以在任何的电子产品中&#xff0c;甚至包括最简单的 51 作为主控芯片的系统中&#xff0c;轻松实现语音识…

Axure基础:事件和动态面板

这一篇文章我们主要是将如何做系统左侧的导航&#xff0c;并且告诉大家如何动态的切换各个页面。 一、事件 1、事件基础 事件的核心就是什么时候做什么事。其中的什么时候可以是如下&#xff1a; 能做的事情如下&#xff1a; 2、远程监控云中的事件 监控云需要达到这个效果…

React :一、简单概念

目录 1.什么是React&#xff1f; 2.谁开发的 3.为什么要学React&#xff1f; 4.React的特点&#xff1f; 5.React依赖包 6.第一个React程序 7.虚拟DOM的两种创建方法 8.虚拟DOM和真实DOM 1.什么是React&#xff1f; 用于构建用户界面的JavaScript库&#xff0c;是一个将…

Allegro如何用自带的功能将线段变成铜皮操作指导

Allegro如何用自带的功能将线段变成铜皮操作指导 在做PCB设计的时候,有时根据设计需要将线段变成铜皮,可以借助辅助工具来实现这一操作,但是Allegro自身也自带这个功能,如下图 需要把这段走线变成铜皮 具体操作如下 点击File点击Change Editor

【计算机基础】Socket IO

一、I/O 模型 一个输入操作通常包括两个阶段&#xff1a; 等待数据准备好从内核向进程复制数据 对于一个套接字上的输入操作&#xff0c;第一步通常涉及等待数据从网络中到达。当所等待数据到达时&#xff0c;它被复制到内核中的某个缓冲区。第二步就是把数据从内核缓冲区复…

在超算上安装文件树命令tree

超算平台使用的centos系统没有内置tree命令&#xff0c;需要通过源码安装。记录安装流程如下。 1. 下载源码包 下载链接如下&#xff1a; http://mama.indstate.edu/users/ice/tree/ 选择“Download the latest version” 如本文下载了源码包“tree-2.1.0.tgz”. 2. 源码包…

分享一个应急响应web日志:access.log文件分析小工具

有时做应急响应的时候&#xff0c;需要提取web日志如access.log日志文件来分析系统遭受攻击的具体原因&#xff0c;由于开源的工具并不是很好用&#xff0c;所以自己用Python3写了一个简单的日志分析工具。先介绍一下access.log日志access.log日志文件记录了所有目标对Web服务器…