圈(circle)

题目大意

一开始看这道题,觉得有点像备用钥匙那道题,需要离散化,

把一个球的两个点分开看...

但是..其中的规律我推不出来

(不是很难,只是蒟蒻好久都没有自己独立思考了)

题解

题解给的是离散化+线段树...
有一点点麻烦

看到其他轻松切题的大佬的代码

但关键部分的思想都是一样的

如果一个圆被其他圆完全分割,则这个圆增加的块数为2,否则为1

将所有圆按左端点从小到大排序,如果相同的话,就再按右端点从小到大排序

那么遍历圆,如果它的左右两个点都没有或者有一个没有被遍历到的话,将其加入到map中

如果都有被遍历到的话,那么他外面一定套着一个大的圆(于是当我这篇博客的时候我发现了问题...这个想法是错误的...我还是把它说完吧)对答案的贡献就+1。

#include<bits/stdc++.h>
#define ll long long
using namespace std; inline int read()
{
int sum = ,p = ;
char ch = getchar();
while(ch < '' || ch > '')
{
if(ch == '-')
p = -;
ch = getchar();
}
while(ch >= '' && ch <= '')
{
(sum *= ) += ch - '';
ch = getchar();
}
return sum * p;
} const int N = ;
map<int,bool>p;
ll ans,n;
struct node
{
int l, r;
} e[N];
bool cmp(node x, node y)
{
if(x.l != y.l)
return x.l < y.l;
else
return x.r < x.r;
}
int main()
{
freopen("circle.in","r",stdin);
freopen("circle.out","w",stdout);
n = read();
ans = n + ;
for(int i = ; i <= n; i++)
{
int x = read(),r = read();
e[i].r = x + r;
e[i].l = x - r;
}
sort(e + ,e + n + ,cmp);
for(int i = ; i <= n; i++)
{
if(p[e[i].l] && p[e[i].r])
ans++;
else
p[e[i].l] = p[e[i].r] = ;
}
printf("%lld\n", ans);
return ;
}

错误算法

hack数据:3 0 20 0 10 15 5

还是安安心心看std吧

在所有圆中,如果一个圆的半径小于等于另一个圆的半径则这个圆不会包含另一个圆

所以按圆的半径由小到大排序则前面的圆只能只能被后面的圆包含。因此只需统计当前的圆是否被前面的圆覆盖。

因此先统计所有可能的区间将所有的点离散化,用线段数统计所有区间。每统计到下一个圆,先计算当前圆所包含的所有区间是否被完全覆盖。如果被完全覆盖,则答案+2。否则答案+1,然后将当前圆所包含的区间在线段树上标记。

时间复杂度 O( N log(N))。

注意最后答案需要+1(最大区间)。

(好好好麻烦...)

#include<stdio.h>
#include<algorithm>
using namespace std;
int n;
struct cir
{
int r,pos;
}a[];
int has[],tmp[];
int cnt,ans;
int sum[];
int cmp(cir x,cir y)
{
return x.r<y.r;
}
void pushup(int x)
{
sum[x]=sum[x*]&sum[x*+];
}
void pushdown(int x)
{
sum[x*]|=sum[x];
sum[x*+]|=sum[x];
}
void insert(int lq,int rq,int ln,int rn,int now)
{
if(has[ln]>=lq&&has[rn+]<=rq)
{
sum[now]=;
return;
}
int mid=(ln+rn)>>;
if(has[mid]>=lq)
insert(lq,rq,ln,mid,now*);
if(has[mid+]<rq)
insert(lq,rq,mid+,rn,now*+);
pushup(now);
}
int query(int lq,int rq,int ln,int rn,int now)
{
if(has[ln]>=lq&&has[rn+]<=rq)
return sum[now];
pushdown(now);
int mid=(ln+rn)>>;
int ret=;
if(has[mid]>=lq)
ret&=query(lq,rq,ln,mid,now*);
if(has[mid+]<rq)
ret&=query(lq,rq,mid+,rn,now*+);
return ret;
}
int main()
{
// freopen("circle.in","r",stdin);
// freopen("circle.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d%d",&a[i].pos,&a[i].r);
tmp[i*-]=a[i].pos-a[i].r;
tmp[i*]=a[i].pos+a[i].r;
}
sort(tmp+,tmp++*n);
for(int i=;i<=*n;i++)
{
if(tmp[i]!=tmp[i-]||i==)
has[++cnt]=tmp[i];
}
sort(a+,a++n,cmp);
for(int i=;i<=n;i++)
{
ans++;
if(query(a[i].pos-a[i].r,a[i].pos+a[i].r,,cnt-,))
ans++;
insert(a[i].pos-a[i].r,a[i].pos+a[i].r,,cnt-,);
}
printf("%d",ans+);
}

幸福快乐std

8.10-Day1T2圈(circle)的更多相关文章

  1. 10分钟轻松学会python turtle绘图

     1. 画布(canvas) 1.1 相关函数: 2. 画笔 2.1 画笔的状态 2.2 画笔的属性 2.3 绘图命令 3. 命令详解 4. 绘图举例 4.1 太阳花 4.2 绘制小蟒蛇 4.3 绘 ...

  2. 10分钟轻松学会 Python turtle 绘图

    python2.6版本中后引入的一个简单的绘图工具,叫做海龟绘图(Turtle Graphics),turtle库是python的内部库,使用导入即可 import turtle 先说明一下turtl ...

  3. libgdx学习记录25——Rectangle与Circle是否重叠

    Rect与Circle重叠有三种情况: 1. Rect至少有一个角在Circle里面 2. Circle与Rect的左边或右边相交,或者Circle在Rect内 3. Circle与Rect的顶边或底 ...

  4. CSS3 Gradient 渐变

    转载自:http://www.w3cplus.com/content/css3-gradient CSS3发布很久了,现在在国外的一些页面上常能看到他的身影,这让我羡慕已久,只可惜在国内为了兼容IE, ...

  5. CSS实现圆角,三角,五角星,五边形,爱心,12角星,8角星,圆,椭圆,圆圈,八卦

    转自:http://blog.csdn.net/chenhongwu666/article/details/38905803 CSS实现圆角,三角,五角星,五边形,爱心,12角星,8角星,圆,椭圆,圆 ...

  6. python turtle 例子 海归绘图

          太阳花 1 # coding=utf-8 2 import turtle 3 import time 4   5 # 同时设置pencolor="red", fillc ...

  7. CSS3的渐变-gradient

    CSS3 Gradient分为linear-gradient(线性渐变)和radial-gradient(径向渐变). CSS3的线性渐变 一.线性渐变在Mozilla下的应用 语法: -moz-li ...

  8. 不给糖果就捣乱,用Python绘制有趣的万圣节南瓜怪【华为云分享】

    关于万圣节 万圣节又叫诸圣节,在每年的11月1日,是西方的传统节日:而万圣节前夜的10月31日是这个节日最热闹的时刻.在中文里,常常把万圣节前夜(Halloween)讹译为万圣节(All Saints ...

  9. 图论介绍(Graph Theory)

    1 图论概述 1.1 发展历史 第一阶段: 1736:欧拉发表首篇关于图论的文章,研究了哥尼斯堡七桥问题,被称为图论之父 1750:提出了拓扑学的第一个定理,多面体欧拉公式:V-E+F=2 第二阶段( ...

  10. Fast Bokeh Effects Using Low-Rank Linear Filters

    Fast Bokeh Effects Using Low-Rank Linear Filters paper地址:https://www.researchgate.net/publication/27 ...

随机推荐

  1. 剑指offer 15.链表反转

    15.链表反转 题目描述 输入一个链表,反转链表后,输出新链表的表头. PHead,pre, next分别指向当前结点, 前一个结点, 后一个结点,每次迭代先更新当前结点的指针,记录下个结点的指向,转 ...

  2. thinkphp5出现mkdir() Permission denied报错解决办法

    如果没有runtime目录,则需要手动创建一个,并且给runtime添加权限: mkdir runtime chmod -R 777 runtime 报错如下:

  3. Wannafly Camp 2020 Day 6M 自闭 - 模拟

    按题意模拟,又乱又烦,没什么可说的 #include <bits/stdc++.h> using namespace std; #define int long long int n,m, ...

  4. arm学习笔记

    学习ARM也有一定时间了,想想还是记点东西,要不以后就忘了.这是我的第一片,简简单单.但比较基础.1. ARM中一些常见英文缩写解释MSB:最高有效位:LSB:最低有效位:AHB:先进的高性能总线:V ...

  5. 火狐浏览器将网页保存为pdf

    目录 火狐打印功能 火狐插件 save as pdf 深夜更博仙女镇 @ 有时候查一些技术博客之类的,当时收藏了,过一阵子再想查看的时候发现404了,所以稳妥的办法还是将把网页保存为pdf. 火狐打印 ...

  6. android 直接添加一个Fragment到activity,不需要额外setContentView

    getSupportFragmentManager().beginTransaction().replace(android.R.id.content,new ArticleListFragment( ...

  7. OpenGL 编程指南 (3.2)

    1.帧缓冲对象 帧缓冲对象对于离屏渲染.纹理贴图更新.缓存乒乓技术(buffer ping-pongqing,GPGPU的一种数据传输方式)的实现意义非凡,它减少了大量的数据拷贝工作. 建立帧缓冲需要 ...

  8. 《深入理解Java虚拟机》读书笔记五

    第六章 类文件结构 1.无关性的基石 各种不同平台的虚拟机与所有平台都统一使用程序存储格式——字节码是构成平台无关的基石. 实现语言无关性的基础仍然是虚拟机和字节码存储格式,Java虚拟机不和包括Ja ...

  9. Myeclipse异常

    打不开文件 问题描述:Myeclipse然打开什么东西都报错了:Could not open the editor: Invalid thread access 解决方法:1.cmd 2.cd 进入你 ...

  10. 一键安装各个版本boost库(无需编译)

    1.NuGet 最简单的,用VS自带的NuGet包管理器安装,一般比较常用的上面都有 2.下载exe安装包 在这里https://sourceforge.net/projects/boost/file ...