圈(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. Ubuntu 16 服务器配置PHP+MySQL+Apache环境

    一.获取软件包资源并进行资源更新 apt是Ubuntu上默认的软件包管理器,使用它可以很容易进行各种软件安装,而且会自动帮你安装可能需要的依赖关系. 另一个强大的软件管理工具是 dpkg,可以用于安装 ...

  2. mp3格式音频 不能立即播放

    原因是mp3的meta信息在mp3文件后面,所以要都加载完才能播放 而m4a 格式的 可以立即播放

  3. 初识XXE漏洞

    本文是参照本人觉得特别仔细又好懂的一位大佬的文章所做的学习笔记 大佬的链接:https://www.cnblogs.com/zhaijiahui/p/9147595.html#autoid-0-0-0 ...

  4. Wormholes POJ - 3259 spfa判断负环

    //判断负环 dist初始化为正无穷 //正环 负无穷 #include<iostream> #include<cstring> #include<queue> # ...

  5. 【转】idea远程调试

    适用于web服务,thrift服务 对于分布式系统的调试不知道大家有什么好的方法.对于我来说,在知道远程调试这个方法之前就是在代码中打各种log,然后重新部署,上线,调试,这样比较费时.今天咱们来了解 ...

  6. md基础语法总结

    md即为Markdown,Markdown的目标是实现「易读易写」,可读性,无论如何,都是最重要的.其实md的底层最终还是将我们写的语法转化为html标签了 --------------------- ...

  7. MySQL | linux中数据库导出和导入

    一.数据库导出(深坑) 命令:mysqldump -u用户名 -p密码 要导出的数据库 > 导出之后的文件.sql mysqldump -uroot -p database_01 > da ...

  8. jupyter快捷键使用

    1. 服务启动与停止 环境为windows10系统 ctrl+R输入cmd,输入命令jupyter notebook启动 使用Control-c停止服务 2.常用快捷键 模式切换 当前cell侧边为蓝 ...

  9. 编码 - 坑 - win10 下采用 utf-8, 导致 gitbash 中文字体异常, 待解决

    blog01 概述 使用 git 中, 遇到一个坑 背景 最近遇到一个 编码转换 问题 本来也 一知半解 要是有人能给我讲讲就好了 环境 win10 1903 git 2.20.1 1. 问题 概述 ...

  10. [CF]Round511

    这场比赛我及时的参加了,但是打的时候状态实在是太烂了,只做出来了Div2的AB题. A Little C loves 3 I 直接构造就行. B Cover Points 应该很容易就看出来这个等腰三 ...