http://www.lydsy.com/JudgeOnline/problem.php?id=4561

一开始并不会做,后来看题解看懂了。

看懂了之后还是错了好几次,数组大小手残开小了。

圆的包含并不包括内切!

具体做法是扫描线, 维护扫描线中的圆和一个垂直于x轴的直线的交点,在扫描线中交点的纵坐标是递增的,每个圆和这条直线有两个交点。

遇到一个圆的左端点,查询它的upper_bound,如果upper_bound是一个圆的上半弧的交点,则它被这个圆包含;如果是一个圆的下半弧的交点,则它和这个圆被包含的状况相同。

然后把它的上半弧和下半弧加入扫描线,为了之后计算交点。

遇到一个圆的右端点,删除它的上半弧和下半弧。

圆只有相离和包含保证了扫描线的正确性。

扫描线可以用splay,set或fhqtreap维护,小神说总之是能查前驱后继的东东

今天终于会用set啦~~~

#include<set>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = 200003;
int in() {
int k = 0, fh = 1; char c = getchar();
for (; c < '0' || c > '9'; c = getchar())
if (c == '-') fh = -1;
for (; c >= '0' && c <= '9'; c = getchar())
k = k * 10 + c - 48;
return k * fh;
} struct Circle {
int x, y, r;
Circle(int _x = 0, int _y = 0, int _r = 0)
: x(_x), y(_y), r(_r) {}
} C[N]; struct Point {
int id, x, mark;
Point(int _id = 0, int _x = 0, int _mark = 0)
: id(_id), x(_x), mark(_mark) {}
bool operator < (const Point &A) const {
return x < A.x;
}
} P[N << 1]; struct node {
int id, mark;
node(int _id = 0, int _mark = 0)
: id(_id), mark(_mark) {}
}; ll sqr(int x) {return 1ll * x * x;} int n, tot = 0, nowx, k[N]; set <node> S;
set <node> :: iterator tmp; bool operator < (node A, node B) {
double Y1 = (double) C[A.id].y + (double) A.mark * sqrt(sqr(C[A.id].r) - sqr(C[A.id].x - nowx));
double Y2 = (double) C[B.id].y + (double) B.mark * sqrt(sqr(C[B.id].r) - sqr(C[B.id].x - nowx));
return Y1 != Y2 ? Y1 < Y2 : A.mark < B.mark;
} ll ans = 0; int main() {
int x, y, r;
n = in();
for (int i = 1; i <= n; ++i) {
x = in(); y = in(); r = in();
C[i] = Circle(x, y, r);
P[++tot] = Point(i, x - r, 1);
P[++tot] = Point(i, x + r, -1);
}
sort(P + 1, P + tot + 1);
for (int i = 1; i <= tot; ++i) {
nowx = P[i].x;
if (P[i].mark == 1) {
tmp = S.upper_bound(node(P[i].id, 1));
if (tmp == S.end())
k[P[i].id] = 1;
else
if (tmp->mark == 1)
k[P[i].id] = -k[tmp->id];
else
k[P[i].id] = k[tmp->id];
S.insert(node(P[i].id, 1));
S.insert(node(P[i].id, -1));
} else {
S.erase(node(P[i].id, 1));
S.erase(node(P[i].id, -1));
}
} for(int i = 1; i <= n; ++i)
ans += sqr(C[i].r) * k[i];
printf("%lld\n", ans);
return 0;
}

【BZOJ 4561】【JLOI 2016】圆的异或并的更多相关文章

  1. 计数方法(扫描线):JLOI 2016 圆的异或并

    Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面 积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个 ...

  2. bzoj 4561: [JLoi2016]圆的异或并

    Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面 积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个 ...

  3. BZOJ 4561 [JLoi2016]圆的异或并 ——扫描线

    扫描线的应用. 扫描线就是用数据结构维护一个相对的顺序不变,带修改的东西. 通常只用于一次询问的情况. 抽象的看做一条垂直于x轴直线从左向右扫过去. 这道题目要求求出所有圆的异或并. 所以我们可以求出 ...

  4. 【BZOJ-4561】圆的异或并 set + 扫描线

    4561: [JLoi2016]圆的异或并 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 254  Solved: 118[Submit][Statu ...

  5. bzoj4561: [JLoi2016]圆的异或并 圆的扫描线

    地址:http://www.lydsy.com/JudgeOnline/problem.php?id=4561 题目: 4561: [JLoi2016]圆的异或并 Time Limit: 30 Sec ...

  6. bzoj4561: [JLoi2016]圆的异或并

    Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面 积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个 ...

  7. BZOJ4561 JLoi2016 圆的异或并 【扫描线】【set】*

    BZOJ4561 JLoi2016 圆的异或并 Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面积并.异或面积并为:当一片区 ...

  8. 【BZOJ4561】[JLoi2016]圆的异或并 扫描线

    [BZOJ4561][JLoi2016]圆的异或并 Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面积并.异或面积并为:当一 ...

  9. [JLOI2016]圆的异或并

    Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个圆 ...

  10. BZOJ4561:圆的异或并(扫描线+set||splay||线段树)

    在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面    积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个圆内则不考虑. I ...

随机推荐

  1. Android AsyncTask 深度理解、简单封装、任务队列分析、自定义线程池

    前言:由于最近在做SDK的功能,需要设计线程池.看了很多资料不知道从何开始着手,突然发现了AsyncTask有对线程池的封装,so,就拿它开刀,本文将从AsyncTask的基本用法,到简单的封装,再到 ...

  2. iOS面试题总结(一)

    面试题总结 1.#import 跟#include.@class有什么区别?#import<> 跟 #import""又什么区别? include和#import都能完 ...

  3. android 性能优化

    本章介绍android高级开发中,对于性能方面的处理.主要包括电量,视图,内存三个性能方面的知识点. 1.视图性能 (1)Overdraw简介 Overdraw就是过度绘制,是指在一帧的时间内(16. ...

  4. android 多线程

    本章讲述在android开发中,多线程的应用.多线程能够处理耗时的操作并优化程序的性能.本章主要介绍知识点,AsyncTask,Java线程池,ThreadPoolExecutor线程池类.本章案例只 ...

  5. Jsoup解析html终于成功了!!!

    package com.eric.pickupjoke.activity; import java.io.IOException; import java.io.InputStream; import ...

  6. RHEL 5.7 Yum配置本地源[Errno 2] No such file or directory

    在Red Hat Enterprise Linux Server release 5.7 上配置YUM本地源时,遇到了"Errno 5] OSError: [Errno 2] No such ...

  7. iOS多线程到底不安全在哪里?

    iOS多线程安全的概念在很多地方都会遇到,为什么不安全,不安全又该怎么去定义,其实是个值得深究的话题. 共享状态,多线程共同访问某个对象的property,在iOS编程里是很普遍的使用场景,我们就从P ...

  8. mysql5.7.1 zip版本安装记录

    很久没遇到使用mysql的项目了,今天下载了个,发现变了很多,搜索了下,发现按http://www.cnblogs.com/wenthink/p/MySQLInstall.html中提到的基本可以使用 ...

  9. Linux下部署FTP服务器

    Linux下部署FTP服务器 下载安装包 在这里介绍的是离线部署FTP,首先下载对应的rpm包,下载链接为: 下载vsftpd服务 下载FTP客户端 安装ftp服务器 关闭防火墙 service ip ...

  10. psutil一个基于python的跨平台系统信息跟踪模块

    受益于这个模块的帮助,在这里我推荐一手. https://pythonhosted.org/psutil/#processes psutil是一个基于python的跨平台系统信息监视模块.在pytho ...