Vijos 1883 月光的魔法(栈)
来源:互联网 发布:mit 为什么使用python 编辑:程序博客网 时间:2024/05/01 12:26
由一些圆心都在x轴上的圆,任意两个圆的关系只会是内含,内切,外切,外离。求圆把平面分成多少个部分。
题目做法据说很多,仅知道其中两种:栈和并查集。
首先对圆进行排序,优先左端点位置,然后是半径长度。然后从左到右扫描一遍。
#include <algorithm>#include <iostream>#include <stdlib.h>#include <string.h>#include <stdio.h>#include <math.h>using namespace std;#define MAXN 300100#define LL long long#define INF 1000000100struct Circle{ LL l, r, cnt, cap; Circle() {} Circle(LL _l, LL _r, LL _cnt, LL _cap): l(_l), r(_r), cnt(_cnt), cap(_cap){} bool operator <(const Circle &argu) const { if(l == argu.l) return argu.r < r; else return l < argu.l; } void out() { printf("%I64d %I64d %I64d %I64d\n", l, r, cnt, cap); }}cc[MAXN];int n, ctop;LL x, r;int s[MAXN];int main(){ //freopen("1883.in", "r", stdin); scanf("%d", &n); cc[0] = Circle(-INF, (LL)2 * INF, (LL)1, (LL)3 * INF); for(int i = 1; i <= n; i++) { scanf("%I64d%I64d", &x, &r); cc[i] = Circle(x - r, x + r, (LL)1, (LL)2 * r); } n++; sort(cc, cc + n); ctop = s[0] = 0; for(int i = 1; i < n; i++) { while(cc[i].l >= cc[s[ctop]].r) { if(cc[s[ctop]].cap == 0) cc[s[ctop]].cnt++; cc[s[ctop - 1]].cnt += cc[s[ctop]].cnt; ctop--; } cc[s[ctop]].cap -= cc[i].r - cc[i].l; s[++ctop] = i; } while(ctop > 0) { if(cc[s[ctop]].cap == 0) cc[s[ctop]].cnt++; cc[s[ctop - 1]].cnt += cc[s[ctop]].cnt; ctop--; } printf("%I64d\n", cc[0].cnt); return 0;}
0 0
- Vijos 1883 月光的魔法(栈)
- vijos P1883月光的魔法
- vijos p1883 月光的魔法
- vijos1883 月光的魔法
- [Vijos]P1282 佳佳的魔法照片
- 【Vijos-P1285】佳佳的魔法药水-Dijkstra思想
- 【vijos】【树形dp】佳佳的魔法药水
- vijos 1417 魔法塔防
- 月光下的女孩
- 月光下的凤尾竹
- 王心凌的月光
- 月光石的识别
- 月光下的乡愁
- 月光下的凤尾竹
- 那时的月光
- 城里的月光
- 午夜的月光
- 月光
- Spring事务解析
- SQL数据库中让字段自动更新
- 首篇
- webrtc 名词
- chromium的RenderProcess的启动
- Vijos 1883 月光的魔法(栈)
- Android总结1
- 当虚拟目录不是在80端口且打开ssl时出错 ssl_error_rx_record_too_long .
- 纯代码写iOS
- Dynamics CRM2013 注释中的内容无法正常显示问题
- HDU--2955--Robberies--01背包
- ant的基本使用
- javascript小例子--实现邮箱验证的功能
- opengl shader 学习 随笔四