vijos1883 月光的魔法

题目

背景
影几欺哄了众生了
天以外——
月儿何曾圆缺
 
描述
有些东西就如同月光的魔法一般.
Luke是爱着vijos的.
他想为自己心爱的东西画些什么.
就画N个圆吧.
把它们的圆心都固定在x轴上.
圆与圆.
为了爱,两两不能相交.
为了爱,它们可以互相贴在一起.
内切或外切,都是允许的.
vijos的美丽,在于人心.
vijos的孩子们,一定能告诉大家:Luke画的圆究竟把平面分割成了多少块?
月光恬美地洒在大地上.
Luke知道,如果什么都不画,平面就只有一块.多美呢!
Luke知道,只画一个圆,平面就分成了两块.也很美呢!
但Luke还是要多画一些的,因为他真的深爱着vijos呢.

INPUT

输入数据第一行:输出一个整数N,1<=N<=300,000.表示圆的个数.
之后N行,每一行有2个整数,x[i]和r[i]表示圆心固定在x[i]的位置,半径为r[i].
-1,000,000,000<=x[i]<=1,000,000,000
1<=r[i]<=1,000,000,000
所有圆都是唯一的,不会出现重叠.

OUTPUT

输出只有一行,要求输出平面被分割成了多少块.

SAMPLE

INPUT

4
7 5
-9 11
11 9
0 20

OUTPUT

6

解题报告

本次考试觉得唯一能A的一道题 (唯一能拿分的题吧啊喂),然而还是打挂了- -
正解:
我们考虑一下每个圆对答案的贡献,当它只是单独的一个圆时,它只把整个平面分割成圆内与圆外两部分,故贡献为1,同理,各种内切与外切也没有什么影响,但我们考虑,如果一个圆被沿直径一个点不差的被分开,它自己就又被分成两个部分,贡献就为2。
如何判断呢,显然10^9的坐标是无法正常处理的,所以我们需要离散,用线段树维护区间被覆盖的点,把圆压成线段,每加入一个线段,就判断该区间是否已经被覆盖,假如被覆盖,说明该圆已经被沿直径分开了,那么它的贡献为2,否则为1.
你以为这样就结束了?NONONO(莫名中二= =)。我们考虑这样一种情况,我们已经有了两个圆,一个占领了1~2,一个占领了3~4,我们现在要加入一个1~4的圆,首先,我们自然会查询1~4的总权值,得到4,是不是就会认为1~4全部覆盖然后开心的加了2?显然是错误的,2~3这一段区间并未被覆盖,但我们认为它被覆盖了,那么我们如何处理呢?
我们可以把每个点劈成两半,一个称为该点的左半点,一个称为该点的右半点,那么当两个圆切于该点时,自然可以认为,一个圆覆盖了左半点,一个圆覆盖了右半点,此时再按上面那种方法判断,就啥事也没有啦
 #include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<map>
using namespace std;
inline int read(){
int sum(),f();
char ch(getchar());
for(;ch<''||ch>'';ch=getchar())
if(ch=='-')
f=-;
for(;ch>=''&&ch<='';sum=sum*+ch-'',ch=getchar());
return sum*f;
}
map<int,int>ma;
struct node{
int l,r;
friend bool operator<(const node &a,const node &b){
return (a.r-a.l)<(b.r-b.l);
}
}a[];
int n;
int tmp[];
int cnt;
int sum[<<],add[<<];
inline void pushup(int i){
sum[i]=sum[i<<]+sum[i<<|];
}
inline void pushdown(int i,int len){
if(add[i]){
add[i<<]=add[i];
add[i<<|]=add[i];
sum[i<<]=add[i]*(len-(len>>));
sum[i<<|]=add[i]*(len>>);
add[i]=;
}
}
inline void update(int ll,int rr,int c,int l,int r,int i){
if(ll>rr)
return;
if(ll<=l&&r<=rr){
add[i]=c;
sum[i]=c*(r-l+);
return;
}
pushdown(i,r-l+);
int mid((l+r)>>);
if(ll<=mid)
update(ll,rr,c,l,mid,i<<);
if(mid<rr)
update(ll,rr,c,mid+,r,i<<|);
pushup(i);
}
inline int query(int ll,int rr,int l,int r,int i){
if(ll>rr)
return ;
if(ll<=l&&r<=rr)
return sum[i];
pushdown(i,r-l+);
int mid((l+r)>>);
int ret();
if(ll<=mid)
ret+=query(ll,rr,l,mid,i<<);
if(mid<rr)
ret+=query(ll,rr,mid+,r,i<<|);
return ret;
}
int ans();
int main(){
n=read();
for(int i=;i<=n;i++){
int x(read()),r(read());
a[i].l=x-r,a[i].r=x+r;
tmp[++cnt]=a[i].l,tmp[++cnt]=a[i].r;
}
sort(tmp+,tmp+cnt+);
cnt=;
for(int i=;i<=(n<<);i++)
if(!ma.count(tmp[i]))
ma[tmp[i]]=++cnt;
sort(a+,a+n+);
for(int i=;i<=n;i++){
a[i].l=ma[a[i].l]<<;
a[i].r=(ma[a[i].r]<<)-;//cout<<i<<' '<<l<<' '<<r<<endl;
if(query(a[i].l,a[i].r,,n<<,)==a[i].r-a[i].l+)
ans+=;
else
ans++;
update(a[i].l,a[i].r,,,n<<,);
}
printf("%d",ans);
}
话说我当时用线段建了个图,然后dfs,现在想想也是蠢= =

[补档]vijos1883 月光的魔法的更多相关文章

  1. [vijos1883]月光的魔法<递归>

    题目链接:https://vijos.org/p/1883 这道题还有另外一种版本叫天神下凡,属于模拟题,可是模拟题数据太水以至于模拟题A了都不一定在vijos上A.... 在模拟题里我用的是一种类似 ...

  2. voijs1883 月光的魔法

    背景 影几欺哄了众生了天以外——月儿何曾圆缺 描述 有些东西就如同月光的魔法一般. Luke是爱着vijos的.他想为自己心爱的东西画些什么. 就画N个圆吧.把它们的圆心都固定在x轴上. 圆与圆.为了 ...

  3. [补档]暑假集训D4总结

    考试 爆零了,不开心,打了两道自己以为是正解的东西,打了两道样例骗分,结果发现并没有给样例分= =,自己以为的正解也打挂了,所以就很= = 但是没办法啊,自己弱也不能怪谁,考试这东西有时候也很玄学. ...

  4. STL 补档

    STL 补档 1.vector 作用:它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据. vector在C++标准模板库中的部分内容,它是 ...

  5. 图论补档——KM算法+稳定婚姻问题

    突然发现考前复习图论的时候直接把 KM 和 稳定婚姻 给跳了--emmm 结果现在刷训练指南就疯狂补档.QAQ. KM算法--二分图最大带权匹配 提出问题 (不严谨定义,理解即可) 二分图 定义:将点 ...

  6. [补档] 大假期集训Part.1

    新博客搭起来先补一发档... 那就从大假期集训第一部分说起好了QwQ 自己还是太菜掉回了2016级水平 day1: day1的时候来得有点晚(毕竟准高一)然后进机房发现早就开考了还没有给我题面于是搞了 ...

  7. 软件安装配置笔记(三)——ArcGIS系列产品安装与配置(补档)(附数据库连接及数据导入)

    在前两篇安装配置笔记之后,就忘记把其他安装配置笔记迁移过来了,真是失误失误!趁现在其他文档需要赶紧补上. 目录: 一.ArcMap 二.ArcMap连接数据库并导入数据 三.Arcgis Pro 四. ...

  8. 补档 Codeblocks下的文件标题栏(标签)显示方法

    可能在以下链接也能看到这篇文档 我知道很多人都不知道这个到底叫啥,还不如直接一点: 文件标题栏 就是如下的效果. 解决办法: 在左上角第三个view下,打开后取消Hide editor tabs 选项 ...

  9. Leave It Behind and Carry On ---- 高一下期末考反思 [补档]

    背景 这个学期的前\(\frac{3}{4}\), 我都是在停课集训中度过的, 先是GDKOI, 再是北京集训, 最后是GDOI, 结果GDOI还没进day3就滚粗了. 学校的内容是考完GDOI后回学 ...

随机推荐

  1. 发布.net mvc遇到的HTTP错误 403.14-Forbidden解决办法

    请检查一下"处理程序映射",里面是否有"ExtensionlessUrlHandler-Integrated-4.0",如果没有,请注册.net4.0 在运行里 ...

  2. arcgis api for js入门开发系列九热力图效果

    上一篇实现了demo的聚合效果,本篇新增热力图效果,截图如下: 热力图效果实现的思路如下: 1.map.js初始化函数调用聚合效果的js接口,map.heatmap.js实现聚合核心效果的js文件 / ...

  3. RPM基础知识

    RPM包命名原则 httpd-2.2.15-15.el6.centos.1.i686.rpm httpd       软件包名 2.2.15       软件版本 15      软件发布的次数 el ...

  4. MyElipse配置

    DK1.6.0+Tomcat6.0+myEclipse的安装配置 C:\Users\Administrator\AppData\Local\Genuitec\Pulse Explorer JDK1.6 ...

  5. hive集成sentry的sql使用语法

    Sentry权限控制通过Beeline(Hiveserver2 SQL 命令行接口)输入Grant 和 Revoke语句来配置.语法跟现在的一些主流的关系数据库很相似.需要注意的是:当sentry服务 ...

  6. CSS学习笔记10 相对定位,绝对定位与固定定位

    文档流中的元素的位置由元素在 (X)HTML 中的位置决定,这就是最原始的普通流,前面讲到的浮动CSS学习笔记08 浮动可以改变元素在文档流中的位置,除了这个我们还可以通过使用CSS的position ...

  7. 【LeetCode】284. Peeking Iterator

    题目: Given an Iterator class interface with methods: next() and hasNext(), design and implement a Pee ...

  8. 【Android Developers Training】 78. 序言:执行网络操作

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  9. Struts2之初识篇(一)——与struts的区别和基本配置

    Struts2资源下载地址: Struts官方地址:http://struts.apache.org/ 我这里下载了struts2的最新版本struts2-2.5.10.1-all.所有内容如下图: ...

  10. 解决java.lang.NumberFormatException: For input string: "id"

    今天,项目突然报"java.lang.NumberFormatException:For input string:"id"",项目框架是spring,spri ...