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的时候差了一题,当时有思路,但 ...
随机推荐
- android开发系列之ContentObserver
在这篇博客里面我想要分享一下自己最近在项目里面遇到一个比较好的数据同步解决方案,首先让我们先来看看该方案的应用场景:我们在客户端本地利用数据库缓存了一些数据,当我们检测到数据库里面的数据发生变化的时候 ...
- Oracle SQL 查询优化.Part4
一.插入 insert 操作: 1. 复制表结构但不新增数据: -- 复制表结构但不插入数据 create table emp_new as select * from emp where 1 = 2 ...
- Spring Data JPA 事务锁
1.概述 在本快速教程中,我们将讨论在Spring Data JPA中为自定义查询方法和预定义存储库的CRUD方法启用事务锁, 我们还将查看不同的锁类型并设置事务锁超时. 2.锁类型 JPA定义了两种 ...
- centOS中如何修改运行级别!
在图形化界面可以用Ctrl+Alt+F2进入命令行窗口 * 假如你使用了虚拟机,有可能会出现不能进去的问题,原因是因为热键冲突 * 解决办法:修改热键就行了 edit→parameter→hot ke ...
- Mongodb亿级数据量的性能测试
进行了一下Mongodb亿级数据量的性能测试,分别测试如下几个项目: (所有插入都是单线程进行,所有读取都是多线程进行) 1) 普通插入性能 (插入的数据每条大约在1KB左右) 2) 批量插入性能 ...
- 复习Java虚拟机:JVM中的Stack和Heap
在JVM中,内存分为两个部分,Stack(栈)和Heap(堆).这里,我们从JVM的内存管理原理的角度来认识Stack和Heap,并通过这些原理认清Java中静态方法和静态属性的问题. 一般,JVM的 ...
- SAP Sybase SQLAnywhere[ASA]数据库中数据行的存储机制
SQLAnywhere[ASA]数据库(以下简称ASA)中的数据库文件,是如何存储普通的表的记录行呢?插入.更新.删除时,记录行的存储会有什么变化? 了解了这些,才能更好的理解如何对ASA数据库进行调 ...
- go module
前言 go 1.5 引进了vendor管理工程依赖包,但是vendor的存放路径是在GOPATH底下,另外每个依赖还可以有自己的vendor,通常会弄得很乱,尽管dep管理工具可以将vendor平级化 ...
- Vue知识随记
数据绑定内支持JavaScript表达式:string字符串反转用.隔开 js: msg:'Hello ' html: {{ msg.split('').reverse().join('.') }} ...
- Upgrading Elasticsearch
Upgrading Elasticsearch | Elasticsearch Reference [5.6] | Elastic https://www.elastic.co/guide/en/el ...