vijos某次模拟赛原题。。。

处理出每个圆的一级祖先就行了。。。

其实没有那么麻烦,贪心即可出解。

我们将每个圆转换成线段后按左端点小右端点大的方法排序

然后维护一个栈:

对于每一个圆i

如果栈顶右端点比圆i的右端点小,则出栈,直到栈空

否则i的一级祖先就是栈顶,并且加入i到栈。

证明:

因为左端点排序,所以问题转换为找一个最小的右端点能够包含此线段

假如栈顶的右端点比当前右端点小,显然对于所有将来的线段,不可能包含将来的线段(或者说,尽管能,也不是最优解,因为最优解就是当前i)

然后如果有n个圆,那么有n+1个面,如果一个圆能被几个圆分割为两份,那么就加一个面。

所以我们将所有点的一级祖先加上长度然后看每个圆的长度是否为那么长即可。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <iostream>
#include <algorithm>
#include <queue>
#include <set>
#include <vector>
#include <map>
using namespace std;
typedef long long ll;
#define pii pair<int, int>
#define mkpii make_pair<int, int>
#define pdi pair<double, int>
#define mkpdi make_pair<double, int>
#define pli pair<ll, int>
#define mkpli make_pair<ll, int>
#define rep(i, n) for(int i=0; i<(n); ++i)
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
#define CC(i,a) memset(i,a,sizeof(i))
#define read(a) a=getint()
#define print(a) printf("%d", a)
#define dbg(x) cout << (#x) << " = " << (x) << endl
#define error(x) (!(x)?puts("error"):0)
#define printarr2(a, b, c) for1(_, 1, b) { for1(__, 1, c) cout << a[_][__]; cout << endl; }
#define printarr1(a, b) for1(_, 1, b) cout << a[_] << '\t'; cout << endl
inline const ll getint() { ll r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }
inline const int max(const int &a, const int &b) { return a>b?a:b; }
inline const int min(const int &a, const int &b) { return a<b?a:b; } const int N=300005;
struct dat { ll l, r; }a[N];
const bool cmp(const dat &a, const dat &b) { return a.l==b.l?a.r>b.r:a.l<b.l; }
int n, s[N], top, fa[N];
ll sum[N];
int main() {
read(n);
for1(i, 1, n) { int x=getint(), r=getint(); a[i].l=x-r; a[i].r=x+r; }
sort(a+1, a+1+n, cmp);
for1(i, 1, n) {
while(top && a[s[top]].r<a[i].r) --top;
fa[i]=s[top];
s[++top]=i;
}
for1(i, 1, n) sum[fa[i]]+=a[i].r-a[i].l;
int ans=n+1;
for1(i, 1, n) if(sum[i]==a[i].r-a[i].l) ++ans;
printf("%d\n", ans);
return 0;
}

  


背景

Czy找到宝藏获得屠龙宝刀和神秘秘籍!现在他要去找经常ntr他的Jmars报仇……

题目描述

Czy学会了一招“堕天一击”,他对一个地点发动堕天一击,地面上就会留下一个很大的圆坑。圆坑的周围一圈能量太过庞大,因此无法通过。所以每次czy发动技能都会把地面分割。Jmars拥有好大好大的土地,几十眼都望不到头,所以可以假设土地的大小是无限大。现在czy对他发动了猛烈的攻击,他想知道在泽宇攻击之后他的土地被切成几份了?

Czy毕竟很虚,因此圆心都在x坐标轴上。另外,保证所有圆两两之间不会相交。

格式

输入第一行为整数n,表示czy放了n次堕天一击。

接下来n行,每行两个整数x[i],r[i]。表示在坐标(x[i] , 0)放了一次堕天一击,半径为r[i]。

输出一行,表示地面被分割成几块。

样例输入

4

7 5

-9 11

11 9

0 20

样例输出

6

数据范围

对于30%数据,n<=5000

对于100%数据,1<=n<=300000,-10^9<=x[i]<=10^9,1<=r[i]<=10^9.

【noip模拟题】天神下凡(贪心)的更多相关文章

  1. [vijos NOIP模拟题]天神下凡 贪心+搜索

    样例: 考试的时候没时间打了,随便敲了敲就交上去了,没想到竟然编译错误,忘定义n了23333 自己测了测能骗20分hhhh 考虑每个圆对答案的贡献,当一个圆被小圆内切的时候,分成了两半,对答案的贡献就 ...

  2. NOIP模拟题汇总(加厚版)

    \(NOIP\)模拟题汇总(加厚版) T1 string 描述 有一个仅由 '0' 和 '1' 组成的字符串 \(A\),可以对其执行下列两个操作: 删除 \(A\)中的第一个字符: 若 \(A\)中 ...

  3. 【入门OJ】2003: [Noip模拟题]寻找羔羊

    这里可以复制样例: 样例输入: agnusbgnus 样例输出: 6 这里是链接:[入门OJ]2003: [Noip模拟题]寻找羔羊 这里是题解: 题目是求子串个数,且要求简单去重. 对于一个例子(a ...

  4. 9.9 NOIP模拟题

    9.9 NOIP模拟题 T1 两个圆的面积求并 /* 计算圆的面积并 多个圆要用辛普森积分解决 这里只有两个,模拟计算就好 两圆相交时,面积并等于中间两个扇形面积减去两个三角形面积 余弦定理求角度,算 ...

  5. 8.22 NOIP 模拟题

      8.22 NOIP 模拟题 编译命令 g++ -o * *.cpp gcc -o * *.c fpc *.pas 编译器版本 g++/gcc fpc 评测环境 位 Linux, .3GHZ CPU ...

  6. NOIP模拟题17.9.26

    B 君的任务(task)[题目描述]与君初相识,犹如故人归.B 君看到了Z 君的第一题,觉得很难.于是自己出了一个简单题.你需要完成n 个任务,第i 任务有2 个属性ai; bi.其中ai 是完成这个 ...

  7. noip模拟题题解集

    最近做模拟题看到一些好的题及题解. 升格思想: 核电站问题 一个核电站有N个放核物质的坑,坑排列在一条直线上.如果连续M个坑中放入核物质,则会发生爆炸,于是,在某些坑中可能不放核物质. 任务:对于给定 ...

  8. NOIP模拟题 2017.7.3 - 模拟 - 贪心 - 记忆化搜索

    直接暴力模拟,注意判数据结构为空时的取出操作. Code #include<iostream> #include<cstdio> #include<ctime> # ...

  9. 9.22 NOIP模拟题

    吉林省信息学奥赛 2017 冬令营                                                                                    ...

随机推荐

  1. Unity for Windows: III–Publishing your unity game to Windows Phone Store

    原地址:http://digitalerr0r.wordpress.com/2013/08/27/unity-for-windows-iiipublishing-to-windows-phone-st ...

  2. 你在使用assetbundle时可能遇到的坑【转】

    在公司项目开发中,用到了assetbundle,由于是webplayer不像手机,流量限制几乎没有,所以场景都是用assetbundle打包后动态加载的,但是这个过程中,遇到不少坑: 1.Editor ...

  3. 【Linux】less命令

    用途 less主要用于查看档案内容,与more的功能一致,但是比more更强大 全称 less的全称就为less 说明 空格键 :代表向下翻一页 pagedown : 代表向下翻一页 pageup:向 ...

  4. Hbuilder 常用快捷键

    网上搜了一下,对Hbuider的快捷键 另外还有一些实用的组合键: Alt+T→V (检验语法文档) Alt+L→H (代码历史版本)

  5. C++ bool和string转换

    直接贴代码吧.用g++能够编译.測试ok #include <iostream> #include <sstream> using namespace std; int mai ...

  6. 【jquery操作cookie】JQuery中$.cookie()方法的使用(同名cookie会覆盖)

    jquery.cookie.js插件: <script type="text/javascript" src="js/jquery-1.6.2.min.js&quo ...

  7. HTML5学习笔记 Web存储

    HTML5 web存储,一个比cookie更好的本地存储方式. 什么是html5 Web存储 使用HTML5可以在本地存储用户的浏览器数据. 早些时候,本地存储使用的是cookies.但是Web存储需 ...

  8. Cocos2d-x3.0 载入Cocostudio的UI后,button无法点击的解决方法

    原帖地址:http://blog.csdn.net/musicvs/article/details/28390617 近期发现不少朋友都遇到这个问题,用Cocostudio的UI编辑器创建好UI后,在 ...

  9. C#-拷贝目录内容(文件和子目录)

    /// <summary> /// 拷贝目录内容 /// </summary> /// <param name="source">源目录< ...

  10. SQL面试题与附解收集(一)

    数据库三范式是什么? 答: 1NF:字段不可分; 2NF:有主键,非主键字段依赖主键; 3NF:非主键字段不能相互依赖; 解释: 1NF:原子性 字段不可再分,否则就不是关系数据库; 2NF:唯一性 ...