当前位置: 首页 > news >正文

【线段树二分】第十三届蓝桥杯省赛C++ A组/研究生组 Python 研究生组《扫描游戏》(C++)

【题目描述】

有一根围绕原点 O 顺时针旋转的棒 OA,初始时指向正上方(Y 轴正向)。

在平面中有若干物件,第 i 个物件的坐标为(x_{i},y_{i}),价值为 z_{i}

当棒扫到某个物件时,棒的长度会瞬间增长 z_{i},且物件瞬间消失(棒的顶端恰好碰到物件也视为扫到),如果此时增长完的棒又额外碰到了其他物件,也按上述方式消去(它和上述那个点视为同时消失)。

如果将物件按照消失的时间排序,则每个物件有一个排名,同时消失的物件排名相同,请输出每个物件的排名,如果物件永远不会消失则输出 −1。

所有物品坐标两两不同。

【输入格式】

输入第一行包含两个整数 n、L,用一个空格分隔,分别表示物件数量和棒的初始长度。

接下来 n 行每行包含第三个整数x_{i},y_{i}z_{i}

【输出格式】

输出一行包含 n 整数,相邻两个整数间用一个空格分隔,依次表示每个物件的排名。

【数据范围】

对于 30% 的评测用例,1≤n≤500;
对于 60% 的评测用例,1≤n≤5000;
对于所有评测用例,1≤n≤200000,−10^{9} ≤ x_{i},y_{i} ≤ 10^{9},1 ≤ L,z_{i} ≤ 10^{9}

【输入样例】

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

【输出样例】

1 1 3 4 -1

【思路】

题解来源:AcWing 4649. 扫描游戏 - AcWing

【代码】

#include <bits/stdc++.h>
typedef long long LL;
const int N = 2e5 + 10;
const __int128 INF = 1e38;
int n, ans[N], idx;
__int128 len;template <typename T> //快读模板
inline T fastread(T &x)
{x = 0;T w = 1;char ch = 0;while (ch < '0' || ch > '9'){if (ch == '-')w = -1;ch = getchar();}while (ch >= '0' && ch <= '9'){x = x * 10 + (ch - '0');ch = getchar();}return x = x * w;
}struct point
{LL x, y, z;int id;
} a[N];
int Quadrant(point a) //因为棒是顺时针旋转,我们这里把正常意义下的二四象限调换一下
{if (a.x >= 0 && a.y > 0)return 1;if (a.x > 0 && a.y <= 0)return 2;if (a.x <= 0 && a.y < 0)return 3;elsereturn 4;
}
LL cross(point a, point b) //求叉积
{return a.x * b.y - a.y * b.x;
}
bool cmp(point a, point b) //极角排序,排序完后,所有点就按顺时针排好了
{if (Quadrant(a) == Quadrant(b)){if (cross(a, b) == 0) //当极角相同,我们这里按照距离原点距离的平方来排序return a.x * a.x + a.y * a.y < b.x * b.x + b.y * b.y;return cross(a, b) < 0;}return Quadrant(a) < Quadrant(b);
}//线段树
struct
{__int128 minv;
} seg[N * 4]; //线段树维护的是点到原点的距离的区间最小值
void pushup(int id)
{seg[id].minv = std::min(seg[id << 1].minv, seg[id << 1 | 1].minv);
}
void build(int id, int l, int r)
{if (l == r)seg[id].minv = a[l].x * a[l].x + a[l].y * a[l].y;else{int mid = l + r >> 1;build(id << 1, l, mid);build(id << 1 | 1, mid + 1, r);pushup(id);}
}
void change(int id, int l, int r, int pos, __int128 val)
{if (l == r)seg[id].minv = val;else{int mid = l + r >> 1;if (pos <= mid)change(id << 1, l, mid, pos, val);elsechange(id << 1 | 1, mid + 1, r, pos, val);pushup(id);}
}
int search(int id, int l, int r, int ql, int qr, __int128 val) //线段树上二分模板
//返回[ql,qr]这段区间里从左至右第一个小于等于val的元素的下标,不存在就返回-1
{if (l == ql && r == qr) //此时的区间正好是询问区间{if (seg[id].minv > val) //如果整个区间的最小值都大于val,直接返回-1return -1;else{if (l == r)return l;int mid = l + r >> 1;if (seg[id << 1].minv <= val) //如果左儿子里有这样的元素,直接进入左儿子即可return search(id << 1, l, mid, ql, mid, val);else //否则进入右儿子return search(id << 1 | 1, mid + 1, r, mid + 1, qr, val);}return seg[id].minv;}int mid = l + r >> 1;if (qr <= mid)return search(id << 1, l, mid, ql, qr, val);else if (ql > mid)return search(id << 1 | 1, mid + 1, r, ql, qr, val);else{int pos = search(id << 1, l, mid, ql, mid, val);if (pos == -1)return search(id << 1 | 1, mid + 1, r, mid + 1, qr, val);elsereturn pos;}
}
signed main()
{// 注意用了快读就不能关闭流同步,不然大概率会炸fastread(n), fastread(len);for (int i = 1; i <= n; ++i) //初始化ans数组ans[i] = -1;for (int i = 1; i <= n; ++i){fastread(a[i].x), fastread(a[i].y), fastread(a[i].z);a[i].id = i;}std::sort(a + 1, a + n + 1, cmp);build(1, 1, n);int last = 0;     // last维护上一个扫到的点int rank = 0;     // rank记录扫到点的排名int lastrank = 0; // 维护lastrank主要是为了处理有几个点极角相同的特殊情况,根据题意它们的排名相同while (true){int idx = -1;if (last + 1 <= n) //一定要记得这句ifidx = search(1, 1, n, last + 1, n, len * len);if (idx != -1)len += a[idx].z;else{if (last >= 2) //一定要记得这句ifidx = search(1, 1, n, 1, last - 1, len * len);if (idx != -1)len += a[idx].z;}if (idx == -1) //没能找到可以划到的点,退出死循环break;change(1, 1, n, idx, INF); //对于扫过的点,我们可以把它单点修改成无穷大,等价于它消失了if (last == 0)ans[a[idx].id] = ++rank, lastrank = rank;else{if (Quadrant(a[last]) == Quadrant(a[idx]) && cross(a[last], a[idx]) == 0) //该点和上一个点是同时被扫到的,所以排名要一样ans[a[idx].id] = lastrank, ++rank;elseans[a[idx].id] = ++rank, lastrank = rank;}last = idx;}for (int i = 1; i <= n; ++i)printf("%d ", ans[i]);printf("\n");return 0;
}

相关文章:

【线段树二分】第十三届蓝桥杯省赛C++ A组/研究生组 Python 研究生组《扫描游戏》(C++)

【题目描述】 有一根围绕原点 O 顺时针旋转的棒 OA&#xff0c;初始时指向正上方&#xff08;Y 轴正向&#xff09;。 在平面中有若干物件&#xff0c;第 i 个物件的坐标为&#xff08;,)&#xff0c;价值为 。 当棒扫到某个物件时&#xff0c;棒的长度会瞬间增长 &#xff…...

类模板与继承及成员、全局函数的实现

一、类模板与继承 当类模板碰到继承时&#xff0c;需要注意一下几点&#xff1a; 1.当子类继承的父类是一个类模板时&#xff0c;子类在声明的时候&#xff0c;要指定出父类中T的类型 2.如果不指定&#xff0c;编译器无法给子类分配内存 3.如果想灵活指定出父类中T的类型&a…...

怎么制作iOS证书

首先我们登录appuploder官网 搜索 appuploder 第一个就是我们官网啦&#xff0c;网址是&#xff1a;Appuploader home -- A tool improve ios develop efficiency such as submit ipa to appstore and manage ios certificate 可以跨平台开发&#xff0c;无论是Windows还是Ma…...

图床项目实战:从零搭建一个简易图床

项目背景与需求分析 随着互联网的发展&#xff0c;图片分享、存储和管理的需求日益增长。图床作为一种专门用于存储和分享图片的服务&#xff0c;受到了广大用户的欢迎。本项目旨在搭建一个简易的图床系统&#xff0c;满足用户上传、查看和删除图片的基本需求。 技术选型 本项…...

双亲委派机制总结

回顾了一下双亲委派机制&#xff0c;在这记录记录&#xff0c;下一篇会基于打破双亲委派机制来更新 1. 类加载&#xff1a; 多个java文件经过编译打包后生成可运行jar包&#xff0c;最后启动程序。首先需要通过类加载器把主类加载到JVM。主类在运行过程中如果使用到其他类&a…...

C语言数据结构基础————二叉树学习笔记(四)简单的OJ题目练习

1.单值二叉树 965. 单值二叉树 - 力扣&#xff08;LeetCode&#xff09; 建立一个新的函数&#xff0c;用函数传参的方法来记录val的值 如上一篇最后的对称二叉树的习题&#xff0c;建立新的函数来传参 多采用使用反对值的方法&#xff0c;因为如果是相等return true的话&am…...

protobuf学习笔记(一):生成一个比较综合的message

一年前学过对应的知识&#xff0c;终究是太潦草了&#xff0c;这几天网上学习了一下&#xff0c;重新写一下笔记。这里是protobuf和golang的结合 一、protobuf protobuf实际上是一种类似json和gob之类的数据格式&#xff0c;也是grpc的御用格式吧&#xff08;有自己的优势&am…...

[BT]BUUCTF刷题第8天(3.26)

第8天 Web [CISCN2019 华北赛区 Day2 Web1]Hack World 题目明确提示flag在flag表里的flag列&#xff0c;这里先尝试1 返回&#xff1a;你好&#xff0c;glzjin想要一个女朋友。 再尝试1&#xff0c;返回bool(false) 到这里就感觉是布尔盲注的题目类型了&#xff08;虽然我没…...

【前端】-

相对路径和绝对路径是描述文件位置的两种方式。 1. 相对路径&#xff1a;相对于自己的目标文件的位置&#xff0c;以引用文件之间网页所在位置为参考基础&#xff0c;而建立出的目录路径。因此&#xff0c;当保存于不同目录的网页引用同一个文件时&#xff0c;所使用的路径将不…...

uniapp安装axios

先npm安装 npm i axios然后在项目里面建一个utils文件&#xff0c;再建一个index.js 以下是index.js代码&#xff1a; import axios from axios; const service axios.create({baseURL: //xxxx.xxxxx.com///你的请求接口域名, timeout: 6000, // request timeoutcrossDomai…...

基于javaweb宠物领养平台管理系统设计和实现

基于javaweb宠物领养平台管理系统设计和实现 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获取源码联…...

网络问题排查方案

PC上不了网初步排查方案步骤 首先查看配置是否正确&#xff0c;是否使用自动获取&#xff08;DHCP&#xff09;IP&#xff0c;掩码&#xff0c;网关&#xff0c;如果不是&#xff0c;手动配置确认网关&#xff0c;子网掩码&#xff0c;IP是否配置正确&#xff0c;IP是否已有PC使…...

【CMake】所见所闻所学

Note: 本贴仅记录遇到的CMake的问题&#xff0c;以问题为驱动。 - cmake_minimum_required - project - add_executable - target_include_directories - ExternalProject_Add ExternalProject_Add 是 CMake 中用于管理和构建外部项目的模块。通过 ExternalProject_Add&…...

Linux shell脚本切换为root用户执行命令

首先安装expect。 sudo apt install expect 创建shell脚本文件&#xff0c;示例内容如下&#xff1a; #!/usr/bin/expectspawn su rootexpect {"密码&#xff1a;" {send "00000\r"}"Password:" {send "000000\r"}}send "./…...

儿童护眼灯哪个牌子好?盘点五款满分护眼台灯

为人父母以后&#xff0c;守护孩子的健康成了首要任务。随着孩子慢慢长大&#xff0c;课程的增多&#xff0c;作业也随之增加起来。很多孩子从放学回家就开始伏案在桌子上写作业&#xff0c;哪怕天色逐渐变暗&#xff0c;孩子作业仍旧未写完&#xff0c;作为父母的我们不得不担…...

HangZhou Java Journey P1

Java程序运行时类加载机制 下面是对这个流程的详细说明&#xff1a; JVM启动&#xff1a;当Java程序开始执行时&#xff0c;JVM首先启动。JVM的启动涉及到操作系统级别的进程创建和资源分配。 Bootstrap ClassLoader&#xff1a;JVM启动后&#xff0c;首先会初始化Bootstrap …...

fiddler过滤器使用,隐藏图片、js、css请求

如果抓包过程中不想查看图片、js、css请求&#xff0c;或者只想抓某个ip或者某个网页下的请求&#xff0c;可以在过滤器中设置。 &#xff08;1&#xff09;没有开启过滤器 可以看出所有的请求都会抓取&#xff0c;cs、js、图片请求都有 &#xff08;2&#xff09;开启过滤器 …...

HTML基础:8个常见表单元素的详解

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端程序媛。 后台回复“前端工具”可免费获取开发工具&#xff0c;持续更新。 今天来说说 HTML 表单。它是用于收集用户输入信息的元素集合。例如文本框、单选按钮、复选框、下拉列表等。 用户经常填写的表…...

密码学之哈希碰撞和生日悖论

哈希碰撞 哈希碰撞是指找到两个不一样的值&#xff0c;它们的哈希值却相同 假设哈希函数的取值空间大小为k &#xff0c;计算次数为n 先算每个值不一样的概率P’ 所以至少两个值相同(即存在哈希碰撞)的概率P为 生日悖论 假设班里有50个人&#xff0c;求班里至少两个人相同…...

SpringBoot + Redis + Lua = 王炸!

经有一位魔术师&#xff0c;他擅长将Spring Boot和Redis这两个强大的工具结合成一种令人惊叹的组合。他的魔法武器是Redis的Lua脚本。 今天&#xff0c;我们将揭开这个魔术师的秘密&#xff0c;探讨如何在Spring Boot项目中使用Lua脚本&#xff0c;以解锁新的可能性和提高性能…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

热烈祝贺埃文科技正式加入可信数据空间发展联盟

2025年4月29日&#xff0c;在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上&#xff0c;可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞&#xff0c;强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...

es6+和css3新增的特性有哪些

一&#xff1a;ECMAScript 新特性&#xff08;ES6&#xff09; ES6 (2015) - 革命性更新 1&#xff0c;记住的方法&#xff0c;从一个方法里面用到了哪些技术 1&#xff0c;let /const块级作用域声明2&#xff0c;**默认参数**&#xff1a;函数参数可以设置默认值。3&#x…...

WEB3全栈开发——面试专业技能点P7前端与链上集成

一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染&#xff08;SSR&#xff09;与静态网站生成&#xff08;SSG&#xff09; 框架&#xff0c;由 Vercel 开发。它简化了构建生产级 React 应用的过程&#xff0c;并内置了很多特性&#xff1a; ✅ 文件系…...