vijos1883 月光的魔法

2023-11-07 21:08
文章标签 魔法 月光 vijos1883

本文主要是介绍vijos1883 月光的魔法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景

影几欺哄了众生了 天以外—— 月儿何曾圆缺 描述

有些东西就如同月光的魔法一般.

Luke是爱着vijos的. 他想为自己心爱的东西画些什么.

就画N个圆吧. 把它们的圆心都固定在x轴上.

圆与圆. 为了爱,两两不能相交. 为了爱,它们可以互相贴在一起. 内切或外切,都是允许的.

vijos的美丽,在于人心. vijos的孩子们,一定能告诉大家:Luke画的圆究竟把平面分割成了多少块?

月光恬美地洒在大地上. Luke知道,如果什么都不画,平面就只有一块.多美呢! Luke知道,只画一个圆,平面就分成了两块.也很美呢!
但Luke还是要多画一些的,因为他真的深爱着vijos呢. 格式 输入格式

输入数据第一行:输出一个整数N,1<=N<=300,000.表示圆的个数.
之后N行,每一行有2个整数,x[i]和r[i]表示圆心固定在x[i]的位置,半径为r[i].
-1,000,000,000<=x[i]<=1,000,000,000 1<=r[i]<=1,000,000,000 所有圆都是唯一的,不会出现重叠. 输出格式

输出只有一行,要求输出平面被分割成了多少块.

正常情况下,一个圆只会多分出来一块,但是如果一个圆里恰有几个彼此相切的小圆,就会再把这个大圆上下分开。
所以可以离散化之后按半径排序,用线段树维护目前已经被小圆覆盖到的区间。对于一个圆,如果他的直径已经完全被覆盖,他对答案的贡献就是2,否则就是1。然后再用这个圆去覆盖。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct inter
{int l,r;bool operator < (const inter & iii) const{return r-l<iii.r-iii.l;}
}a[300010];
int ori_l[300010],ori_r[300010],ord[600010],lson[3000010],rson[3000010],con[3000010],tag[3000010],n,m,tot=1;
void down(int p)
{if (tag[p]){con[p]=1;tag[lson[p]]=tag[rson[p]]=1;tag[p]=0;}
}
void up(int p)
{down(p);down(lson[p]);down(rson[p]);if (con[lson[p]]==0&&con[rson[p]]==0)con[p]=0;else{if (con[lson[p]]==1&&con[rson[p]]==1)con[p]=1;else con[p]=2;}
}
void build(int p,int ll,int rr)
{if (ll==rr) return;int mid=(ll+rr)/2;lson[p]=++tot;build(tot,ll,mid);rson[p]=++tot;build(tot,mid+1,rr);
}
int find(int p,int ll,int rr,int l,int r)
{down(p);if (ll==l&&rr==r)return con[p]==1;int mid=(ll+rr)/2;if (r<=mid) return find(lson[p],ll,mid,l,r);if (l>mid) return find(rson[p],mid+1,rr,l,r);return find(lson[p],ll,mid,l,mid)==1&&find(rson[p],mid+1,rr,mid+1,r)==1;
}
void mark(int p,int ll,int rr,int l,int r)
{if (ll==l&&rr==r){tag[p]=1;return;}down(p);int mid=(ll+rr)/2;if (r<=mid) mark(lson[p],ll,mid,l,r);else{if (l>mid) mark(rson[p],mid+1,rr,l,r);else{mark(lson[p],ll,mid,l,mid);mark(rson[p],mid+1,rr,mid+1,r);}}up(p);
}
int main()
{int i,j,k,p,q,x,y,z,ans=1;scanf("%d",&n);for (i=1;i<=n;i++){scanf("%d%d",&x,&y);ord[++m]=ori_l[i]=x-y;ord[++m]=ori_r[i]=x+y;}sort(ord+1,ord+m+1);m=unique(ord+1,ord+m+1)-ord-1;for (i=1;i<=n;i++){a[i].l=lower_bound(ord+1,ord+m+1,ori_l[i])-ord;a[i].r=lower_bound(ord+1,ord+m+1,ori_r[i])-ord;}sort(a+1,a+n+1);build(1,1,m-1);for (i=1;i<=n;i++){if (find(1,1,m-1,a[i].l,a[i].r-1)==1) ans+=2;else ans++;mark(1,1,m-1,a[i].l,a[i].r-1);}printf("%d\n",ans);
}

这篇关于vijos1883 月光的魔法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/366283

相关文章

探索Python的数学魔法:Numpy库的神秘力量

文章目录 探索Python的数学魔法:Numpy库的神秘力量背景:为什么选择Numpy?Numpy是什么?如何安装Numpy?五个简单的库函数使用方法场景应用常见Bug及解决方案总结 探索Python的数学魔法:Numpy库的神秘力量 背景:为什么选择Numpy? 在Python的世界中,数据处理和科学计算是不可或缺的一部分。但原生Python在处理大规模数据时可能会显

玩转Python Turtle库,实现满屏飘字的魔法!

前言     本文将教你如何使用Python的Turtle库,通过简单的编程实现满屏飘字的炫酷效果。无需复杂的编程知识,跟着我们的步骤,你也可以成为编程小达人! 效果展示 开发过程 一、准备工作 首先,确保你的电脑上已经安装了Python环境。然后,你需要安装或更新Turtle库(通常Python安装时自带了Turtle库)。 二、编写代码 接下来,我们将通过编写一个简单的P

重复采样魔法:用更多样本击败单次尝试的最强模型

这篇文章探讨了通过增加生成样本的数量来扩展大型语言模型(LLMs)在推理任务中的表现。 研究发现,重复采样可以显著提高模型的覆盖率,特别是在具有自动验证工具的任务中。研究还发现,覆盖率与样本数量之间的关系可以用指数幂律建模,揭示了推理时间的扩展规律。尽管多数投票和奖励模型在样本数量增加时趋于饱和,但在没有自动验证工具的任务中,识别正确样本仍然是一个重要的研究方向。 总体而言,重复采样提供了一种

07_TensorFlow2图像编解码大揭秘:让图片说‘变’就‘变’,魔法还是科技?

1. 图像的编码和解码 在实际应用中,图像数据源格式多种多样,如:png\jpg\bmp等,而神经网络训练模型所需的图像的数据格式为:图像字节数据或Base64编码数据等。基于此,将png\jpg\bmp等格式的图像转换为字节数据的过程称为图像编码,将字节数据的图像转换为png\jpg\bmp等格式图像的过程称为图像解码。 2. 图像编码 Tensorflow图像编码的过程如下图所示,分

【Jupyter】 Notebook 中的 IPython 魔法:12个必知实用技巧

Jupyter Notebook 作为一个强大的交互式计算环境,结合 IPython 的功能,为数据科学家和程序员提供了丰富的工具。本文将介绍12个在 Jupyter Notebook 中使用 IPython 的实用技巧 1. 清除输出:使用 clear_output() from IPython.display import clear_output# 执行一些操作print("This

【深度学习 激活函数】激活函数:深度学习界的“魔法药剂”

大家好!今天我们来聊聊深度学习中的一个重要角色——激活函数。你是否曾经好奇过,为什么神经网络能像魔法一样识别图片、理解和生成文字?答案就在于这些神奇的激活函数! 激活函数:神经网络的“心跳” 想象一下,神经网络就像一个巨大的生物体,而激活函数就是它的心跳。没有心跳,生物体就无法生存;同样,没有激活函数,神经网络就无法正常工作。 激活函数的“魔法” 激活函数就像是给神经网络施加了魔法,让它们

【C#编程技术总结】魔法包唤醒同一局域网设备

目录 一、原理 Wake-on-LAN (WOL) 的工作原理 典型应用场景 配置要求 注意事项 二、代码 一、原理 魔术包(Magic Packet)是Wake-on-LAN(WOL)技术的一部分,它允许远程唤醒网络设备,如计算机或服务器。这个功能通常用于节能和远程管理,当设备处于待机或休眠状态时,可以通过网络将其唤醒,而无需物理操作。 Wake-on-LAN (WOL

Python中的集合魔法:解锁高效数据处理的秘密

引言 集合是一种不允许重复元素的数据结构,并且其内部元素无序排列。这种特性使得集合在某些场景下表现得极为出色: 去重:快速去除列表或数组中的重复项。交集、并集、差集等运算:用于比较两个或多个集合间的关系,非常适用于权限控制、用户管理等领域。性能优势:相较于列表,集合在查找元素时速度更快,平均时间复杂度为O(1)。 基础语法介绍 创建集合 在Python中创建一个空集合需要使用set()函

CSS选择器的魔法:探索:not-child()与:nth-child()

CSS选择器是前端开发中的强大工具,它们允许我们以精确的方式选择和操作网页上的元素。在这篇文章中,我们将深入探讨两个非常有用的CSS选择器::not-child()和:nth-child()。通过这些选择器,我们可以创建动态且具有吸引力的网页布局。 :not-child():排除特定元素 :not-child()选择器允许我们排除特定元素,从而对其他元素应用样式。这在创建复杂的布局时非常有用,

《C++模板元编程:编程世界的魔法艺术》

在 C++的广阔编程领域中,模板元编程犹如一种神秘而强大的魔法艺术,为开发者打开了一扇通往极致性能与高度灵活性的大门。那么,究竟什么是模板元编程?又该如何在 C++中进行模板元编程呢? 首先,让我们来理解一下模板元编程的概念。模板元编程是一种在编译期进行计算和代码生成的技术。它利用 C++模板的强大功能,将程序的一部分计算和决策从运行时转移到编译期。通过这种方式,可以在编译期完成一些复杂的任务,