当前位置: 首页 > news >正文

(单调栈)洛谷 P6875 COCI 2013/2014 KRUŽNICE 题解

题意

现在有 NNN 个以 xxx 轴为中心的互不相交的圆,但圆周可以接触。请问这些圆把平面分成多少块?

1≤N≤3×105,−109≤xi≤1091 \le N \le 3\times 10^5,-10^9 \leq x_i \leq 10^91N3×105,109xi1091≤ri≤1091 \leq r_i \leq 10^91ri109

思路

除了外面一片空白,每个圆内部都会贡献 111,但是当:
在这里插入图片描述
的时候,形如若干个圆覆盖了某个更大圆的直径时,就会多 111 的贡献。(题目保证不会出现任意两个圆有两个交点的情况)

我们知道每个圆的中心坐标和半径,进而知道左、右端坐标。从左到右依次加圆,先加小圆(体现为按照右端点排序)。我们发现一个圆要么接着上一个圆的右端点,要么接到上若干个圆的右端点。出现第二种情况时,当前圆 ooo 内部,可能被分成两部分。

于是维护一个单调栈,维护圆的左端点单调递增。每次加圆 ooo,就把左端点 >o.left>o.left>o.left 的圆弹出——这些被弹出的圆必然在 ooo 内部。如果这些圆的直径之和恰为当前圆的直径(如上所述),那么 ooo 就被分成了两部分。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=3e5+9;
ll n;
struct circ
{ll x,R;ll l,r;
}a[N];
bool cmp(circ x,circ y)
{if(x.r!=y.r)return x.r<y.r;return x.l>y.l;
}
ll stk[N],top;
int main()
{scanf("%lld",&n);for(int i=1;i<=n;i++){ll x,r;scanf("%lld%lld",&x,&r);a[i]=(circ){x,r,x-r,x+r};}sort(a+1,a+n+1,cmp);ll ans=n+1;//背景和n个圆 for(int i=1;i<=n;i++){ll s=0;while(top&&a[stk[top]].l>=a[i].l) {s+=a[stk[top]].R*2;top--;}stk[++top]=i;if(s==a[i].R*2)ans++;//填满直径 }printf("%lld",ans);return 0;
}
http://www.dtcms.com/a/438822.html

相关文章:

  • 地图网站怎么做中国的外贸企业有哪些
  • 外贸公司网站怎么设计更好单页响应式网站模板
  • 恒生电子面经准备
  • 电视剧在线观看完整版免费网站网友让你建网站做商城
  • 大学网站群建设方案设计网名姓氏
  • Qt 按钮点击事件全链路解析:从系统驱动到槽函数
  • 外贸公司建网站一般多少钱京津冀协同发展现状
  • 开发网站 语言优秀营销软文范例300字
  • 木匠手做网站网站主体变更
  • 领码方案 | 掌控研发管理成熟度:从理论透视到AI驱动的实战进阶
  • 为什么学网站开发互联网最吃香的职业
  • MTK调试-耳机驱动
  • Go语言中的map
  • 国土系统网站建设用地受理表花垣县建设局网站
  • 网站建设报告内容合肥经开区建设局网站
  • 华清远见25072班C++学习假期10.3作业
  • 网站建设范本n多国外免费空间
  • 【龙泽科技】智能网联汽车毫米波雷达传感器仿真教学软件
  • Vue 组件定义模板,集合v-for生成界面
  • 花生壳域名可以做网站域名吗新闻资讯网站php源码
  • 【C++】list的使用与模拟实现
  • 企业网站宽度给多少怎么从网站知道谁做的
  • 【深度学习新浪潮】国内主流AI视频生成模型(对标Sora2)技术解析与API代码实战
  • 计算字符串的编辑距离
  • 哪里可以做网站的学影视后期的正规学校
  • Python海象运算符使用指南
  • SDL2 _
  • NO.14数据结构红黑树|树高|转化4阶B树|插入操作|删除操作
  • 学网页设计要多长时间南京seo招聘
  • EPOLLONESHOT事件类型和ET模式有什么区别?