Description

尼克发明了这样一个游戏:在一个坐标轴上,有一些圆,这些圆的圆心都在x轴上,现在给定一个x轴上的点,保证该点没有在这些圆内(以及圆上),尼克可以以这个点为圆心做任意大小的圆,他想知道自己做多可以与多少个给定的圆相交(相切也算,包含不算)。

Input

输入有多组数据 输入到文件尾

每一组数据有一个整数n(1<=n<=100000),表示总共有n个圆。

接下是n行,每行两个整数xi,ri表示该圆的圆心坐标和半径。

接下来一行为一个整数x,表示尼克选取点的位置。

x xi的范围[-10^9,10^9]  ri的范围[1,10^9]

总共有最多10组数据。

Output

每组数据输出一行,表示尼克最多可以覆盖多少个圆。

Sample Input

2
1 2
2 1
4

Sample Output

2

这个题目条件转换一下就是满足|r-d| <= R <= r+d的R就能与r半径的圆相交,其中d是两圆圆心的距离。

这样就变成了区间增值,然后查询区间中的最大值。

首先想到的是线段树,复杂度是O(2n*log(2n))。不过由于半径范围的值是离散的,所以采用map进行映射,使其连续。不过AC用时500ms左右。

然后发现其实直接处理后直接贪心就行。将所有区间的左右端点排序,排序时需要保存标记,用于记录这个端点是某个区间的左端点还是右端点。然后就是扫一遍,对于是左端点的自然值加一,对于右端点的自然值减一,然后贪心过程中的最大值。AC用时85ms左右。

贪心代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <map>
#include <set>
#include <algorithm>
#define LL long long using namespace std; struct node
{
LL index;
bool isleft;
}ind[]; int n, ans;
LL x[], r[], xx; bool cmp(node a, node b)
{
return a.index < b.index;
} LL Abs(LL aa)
{
if (aa < )
return -aa;
else
return aa;
} void Init()
{
LL d, Left, Right;
for (int i = ; i < n; ++i)
{
d = Abs(x[i]-xx);
Left = Abs(r[i]-d);
Right = r[i]+d;
ind[i<<].index = Left;
ind[i<<].isleft = true;
ind[i<<|].index = Right;
ind[i<<|].isleft = false;
}
sort(ind, ind+*n, cmp);
} int main()
{
//freopen("test.in", "r", stdin);
while (scanf("%d", &n) != EOF)
{
for (int i = ; i < n; ++i)
{
scanf("%lld%lld", &x[i], &r[i]);
}
scanf("%lld", &xx);
Init();
int len = *n;
int now = ;
ans = ;
for (int i = ; i < len; ++i)
{
if (ind[i].isleft)
now++;
else
now--;
ans = max(ans, now);
}
printf("%d\n", ans);
}
return ;
}

线段树代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <map>
#include <set>
#include <algorithm>
#define LL long long using namespace std; //线段树
//区间每点增值,求区间最值
const int maxn = ;
struct node
{
int lt, rt;
int val, add;
}tree[*maxn]; //向下更新
void PushDown(int id)
{
if (tree[id].add != )
{
tree[id<<].add += tree[id].add;
tree[id<<].val += tree[id].add;
tree[id<<|].add += tree[id].add;
tree[id<<|].val += tree[id].add;
tree[id].add = ;
}
} //向上更新
void PushUp(int id)
{
tree[id].val = max(tree[id<<].val, tree[id<<|].val);
} //建立线段树
void Build(int lt, int rt, int id)
{
tree[id].lt = lt;
tree[id].rt = rt;
tree[id].val = ;//每段的初值,根据题目要求
tree[id].add = ;
if (lt == rt)
{
//tree[id].add = ??;
return;
}
int mid = (lt + rt) >> ;
Build(lt, mid, id<<);
Build(mid+, rt, id<<|);
//PushUp(id);
} //增加区间内每个点固定的值
void Add(int lt, int rt, int id, int pls)
{
if (lt <= tree[id].lt && rt >= tree[id].rt)
{
tree[id].add += pls;
tree[id].val += pls;
return;
}
PushDown(id);
int mid = (tree[id].lt + tree[id].rt) >> ;
if (lt <= mid)
Add(lt, rt, id<<, pls);
if (rt > mid)
Add(lt, rt, id<<|, pls);
PushUp(id);
} //查询某段区间内的zuizhi
int Query(int lt, int rt, int id)
{
if (lt <= tree[id].lt && rt >= tree[id].rt)
return tree[id].val;
PushDown(id);
int mid = (tree[id].lt + tree[id].rt) >> ;
if (rt <= mid)
return Query(lt, rt, id<<);
if (lt > mid)
return Query(lt, rt, id<<|);
return max(Query(lt, rt, id<<), Query(lt, rt, id<<|));
} int n, cnt;
LL x[], r[], ind[], xx;
LL Left[], Right[];
map <LL, int> id; bool cmp(LL a, LL b)
{
return a < b;
} LL Abs(LL aa)
{
if (aa < )
return -aa;
else
return aa;
} void Init()
{
id.clear();
LL d;
for (int i = ; i < n; ++i)
{
d = Abs(x[i]-xx);
Left[i] = Abs(r[i]-d);
Right[i] = r[i]+d;
ind[i<<] = Left[i];
ind[i<<|] = Right[i];
}
sort(ind, ind+*n, cmp);
int len = *n;
cnt = ;
for (int i = ; i < len; ++i)
{
if (i == )
{
id[ind[]] = ;
continue;
}
if (ind[i] != ind[i-])
{
id[ind[i]] = ++cnt;
}
}
Build(, cnt, );
} int main()
{
//freopen("test.in", "r", stdin);
while (scanf("%d", &n) != EOF)
{
for (int i = ; i < n; ++i)
{
scanf("%lld%lld", &x[i], &r[i]);
}
scanf("%lld", &xx);
Init();
for (int i = ; i < n; ++i)
{
Add(id[Left[i]], id[Right[i]], , );
}
printf("%d\n", Query(, cnt, ));
}
return ;
}

ACM学习历程——NOJ1113 Game I(贪心 || 线段树)的更多相关文章

  1. ACM学习历程—POJ1151 Atlantis(扫描线 && 线段树)

    Description There are several ancient Greek texts that contain descriptions of the fabled island Atl ...

  2. ACM学习历程——HDU3333 Turing Tree(线段树 && 离线操作)

    Problem Description After inventing Turing Tree, 3xian always felt boring when solving problems abou ...

  3. ACM学习历程—HihoCoder1309任务分配(排序 && 贪心)

    http://hihocoder.com/problemset/problem/1309 题目大意是给定n个任务的起始时间,求问最少需要多少台机器. 有一个贪心的策略就是,如果说对于一个任务结束,必然 ...

  4. ACM学习历程—SNNUOJ 1239 Counting Star Time(树状数组 && 动态规划 && 数论)

    http://219.244.176.199/JudgeOnline/problem.php?id=1239 这是这次陕西省赛的G题,题目大意是一个n*n的点阵,点坐标从(1, 1)到(n, n),每 ...

  5. ACM学习历程—HDU 4287 Intelligent IME(字典树 || map)

    Description We all use cell phone today. And we must be familiar with the intelligent English input ...

  6. ACM学习历程—HDU2222 Keywords Search(字典树)

    Keywords Search Description In the modern time, Search engine came into the life of everybody like G ...

  7. BZOJ4391 High Card Low Card [Usaco2015 dec](贪心+线段树/set库

    正解:贪心+线段树/set库 解题报告: 算辣直接甩链接qwq 恩这题就贪心?从前往后从后往前各推一次然后找一遍哪个地方最大就欧克了,正确性很容易证明 (这里有个,很妙的想法,就是,从后往前推从前往后 ...

  8. 【题解】P1712 [NOI2016]区间(贪心+线段树)

    [题解]P1712 [NOI2016]区间(贪心+线段树) 一个observe是,对于一个合法的方案,将其线段长度按照从大到小排序后,他极差的来源是第一个和最后一个.或者说,读入的线段按照长度分类后, ...

  9. ACM学习历程—HDU5696 区间的价值(分治 && RMQ && 线段树 && 动态规划)

    http://acm.hdu.edu.cn/showproblem.php?pid=5696 这是这次百度之星初赛2B的第一题,但是由于正好打省赛,于是便错过了.加上2A的时候差了一题,当时有思路,但 ...

随机推荐

  1. 智能手机的耗电特征及APP耗电量测试的两种方法

    文章陈述了手机发展趋势及耗电特性,集中讨论了时下最为关心的智能手机耗电问题,并介绍了测量手机软件耗电量的两种方法.此外还解释了为何运营商此前会提出收取微信的费用,心跳机制是什么. 美国著名手机公司Pa ...

  2. 小明同学喜欢体育锻炼,他常常去操场上跑步。跑道是一个圆形,在本题中,我们认为跑道是一个半径为R的圆形,设圆心的坐标原点(0,0)。小明跑步的起点坐标为(R,0),他沿着圆形跑道跑步,而且一直沿着一个方向跑步。回到家后,他查看了自己的计步器,计步器显示他跑步的总路程为L。小明想知道自己结束跑步时的坐标,但是他忘记自己是沿着顺时针方向还是逆时针方向跑的了。他想知道在这两种情况下的答案分别是多少。

    include "stdafx.h" #include<iostream> #include<vector> #include<string> ...

  3. Java多线程面试问题

    这篇文章主要是对多线程的面试问题进行总结的,罗列了40个多线程的问题. 1. 多线程有什么用? 一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡.所谓 ...

  4. WPF DataGrid 获取当前行某列值

    [0]是指当前行第1列的单元格位置 注意:DataRowView要求必须引用System.Data命名空间 方法一: DataRowView mySelectedElement = (DataRowV ...

  5. 转载 ---原生和H5交互挺多的,最近也有朋友再问。这儿我写个简单的例子给大家 直接贴代码 js的

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> ...

  6. 自动化测试,基于selenium/appnium 学习

    1. 搭建环境,配置java,安装tomcat 7.0,运行eclipse

  7. 五个知识体系之-Linux常用命令学习

    1.ls命令 就是list的缩写,通过ls 命令不仅可以查看linux文件夹包含的文件,而且可以查看文件权限(包括目录.文件夹.文件权限)查看目录信息等等 常用参数搭配: ls -a 列出目录所有文 ...

  8. 性能测试--Jmeter之wordpress示例

    Jmeter之wordpress示例 WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站.也可以把 WordPress当作一个内容管理 ...

  9. Django框架ORM常用参数汇总_模型层

    primary_key 如果为True,那么这个字段就是模型的主键. 如果你没有指定任何一个字段的primary_key=True, Django就会自动添加一个IntegerField字段做为主键, ...

  10. 我的Java开发学习之旅------>Java NIO 报java.nio.charset.MalformedInputException: Input length = 1异常

    今天在使用Java NIO的Channel和Buffer进行文件操作时候,报了java.nio.charset.MalformedInputException: Input length = 1异常, ...