ACM学习历程——NOJ1113 Game I(贪心 || 线段树)
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(贪心 || 线段树)的更多相关文章
- ACM学习历程—POJ1151 Atlantis(扫描线 && 线段树)
Description There are several ancient Greek texts that contain descriptions of the fabled island Atl ...
- ACM学习历程——HDU3333 Turing Tree(线段树 && 离线操作)
Problem Description After inventing Turing Tree, 3xian always felt boring when solving problems abou ...
- ACM学习历程—HihoCoder1309任务分配(排序 && 贪心)
http://hihocoder.com/problemset/problem/1309 题目大意是给定n个任务的起始时间,求问最少需要多少台机器. 有一个贪心的策略就是,如果说对于一个任务结束,必然 ...
- ACM学习历程—SNNUOJ 1239 Counting Star Time(树状数组 && 动态规划 && 数论)
http://219.244.176.199/JudgeOnline/problem.php?id=1239 这是这次陕西省赛的G题,题目大意是一个n*n的点阵,点坐标从(1, 1)到(n, n),每 ...
- ACM学习历程—HDU 4287 Intelligent IME(字典树 || map)
Description We all use cell phone today. And we must be familiar with the intelligent English input ...
- ACM学习历程—HDU2222 Keywords Search(字典树)
Keywords Search Description In the modern time, Search engine came into the life of everybody like G ...
- BZOJ4391 High Card Low Card [Usaco2015 dec](贪心+线段树/set库
正解:贪心+线段树/set库 解题报告: 算辣直接甩链接qwq 恩这题就贪心?从前往后从后往前各推一次然后找一遍哪个地方最大就欧克了,正确性很容易证明 (这里有个,很妙的想法,就是,从后往前推从前往后 ...
- 【题解】P1712 [NOI2016]区间(贪心+线段树)
[题解]P1712 [NOI2016]区间(贪心+线段树) 一个observe是,对于一个合法的方案,将其线段长度按照从大到小排序后,他极差的来源是第一个和最后一个.或者说,读入的线段按照长度分类后, ...
- ACM学习历程—HDU5696 区间的价值(分治 && RMQ && 线段树 && 动态规划)
http://acm.hdu.edu.cn/showproblem.php?pid=5696 这是这次百度之星初赛2B的第一题,但是由于正好打省赛,于是便错过了.加上2A的时候差了一题,当时有思路,但 ...
随机推荐
- php迭代器模式
其实就是遍历数组 然后对数组中的元素进行操作 实现iterator接口即可.
- HDFS源码分析心跳汇报之周期性心跳
HDFS源码分析心跳汇报之周期性心跳,近期推出!
- Ubuntu 14.04lts安装vncserver
之前有在centos上安装过非常多次vncserver,也写过一个centos 7上的安装文档.近来常识了好几次在ubuntu上安装都没有成功,这次最终搞定了.ubuntu自带的桌面是unity.这个 ...
- Centos 7.0防火墙问题
从Centos7开始,自带的防火墙从iptables更改成了firewall.一般在企业环境,出于人力和稳定性考虑,还是用成熟的技术比较稳妥. 以下是关闭firewall的方法 systemctl s ...
- erlang中判断进程是否存活
一个参数的方法是已知Pid判断进程是否存活.两个参数的方法是已知节点和Pid或进程名判断进程是否存活. is_process_alive(Pid) when is_pid(Pid)->rpc:c ...
- DNS--域名系统 随笔
定义:是一种用于TCP/IP应用程序的分布式数据库.(分布式数据库:指利用高速计算机网络将物理上分散的多个数据存储单元连接起来组成一个逻辑上统一的数据库.分布式数据库的基本思想是将原来集中式数据库中的 ...
- MongoDB的对象的创建
package com.voice.db; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.Mon ...
- 20179209课后作业之od命令重写
一.问题描述: 1 复习c文件处理内容 2 编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能 3. main与其他分开,制作静态库和动态库 4. 编写Makefi ...
- 远程服务器上的weblogic项目管理(一)项目部署与更新流程
最近接手了项目组的服务器管理工作,服务器以linux系统为主,项目则搭建在weblogic上面,也算是积累了一些远程管理服务器的心得,决定稍微整理一下: windows系统要如何方便地连接到远程服务器 ...
- 80端口未被占用,apache无法启动,命令行运行httpd.exe提示文档内容有错
Apache无法启动,端口被占用的可能性比较大,所以建议大家还是先换端口试试,这个网上说的比较多,具体可参见http://www.cnblogs.com/zdan68/p/3855636.html. ...