圈(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. Scrum简介

    1. 什么是Scrum Scrum是一种轻量级的框架,适合于小型的.结合紧密的团队开发复杂的产品.Scrum是二十世纪后期一些软件工程师协同努力的脑力劳动的成果,现已成为技术领域最具魅力的方法.但Sc ...

  2. linux-redis cluster集群(redis5.x)

    1.查看redis安装目录: [root@iZwz97y9qoykzzotubitq3Z redis-5.0.5]# lltotal 472-rw-rw-r-- 1 root root 106874 ...

  3. 一些java基础知识的备忘

    接口和抽象类的区别是什么? 接口的方法默认是 public,所有方法在接口中不能有实现(Java 8 开始接口方法可以有默认实现),而抽象类可以有非抽象的方法. 接口中除了static.final变量 ...

  4. 被遗忘的宝藏-LaTeX发行版自带字体&自己一些字体心得

    KMC大作,如果用xelatex的话,这些知识仅仅作为大家了解.希望对于学习latex有所裨益.原文地址:http://bbs.ctex.org/viewthread.php?tid=43596&am ...

  5. eclipse配置tomcat,并部署一个Java web项目到tomcat上

    引用链接:https://blog.csdn.net/cincoutcin/article/details/79408484 eclipse配置tomcat 1.windows——preference ...

  6. Linux下用Bash语言实现输出水仙花数的功能

    题目链接: 题目描述 打印出所有"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该本身. 例如:153是一个水仙花数,因为153=1^3+5^ ...

  7. 申请一个美国paypal账户

    近期为了做PayPal支付,进口demo已经写好,就差一个美国PayPal账户进行支付测试,几经折腾,终于申请下来,附上参考链接:   paypal官网: https://www.paypal.com ...

  8. Eclipse中配置Tomcat容器

    Tomcat 安装与配置 Tomcat是Apache 软件基金会(Apache Software Foundation)核心项目之一,支持最新的Servlet 和JSP 规范.因为Tomcat 技术先 ...

  9. 【C/C++】最短路径

    BFS求无权图的最短路径 用book数组的值表示路径长度即可,省略 Floyd算法(允许负边) Floyd算法可以一次性求出所有节点之间的最短距离,且代码简单,但是时间复杂度达到了n^3,因此只适用于 ...

  10. Oracle客户端安装及下载地址

    一.下载 http://www.oracle.com/technetwork/database/enterprise-edition/downloads/112010-win64soft-094461 ...