BZOJ 4561: [JLoi2016]圆的异或并 扫描线 + set
看题解看了半天......
Code:
#include<bits/stdc++.h>
#define maxn 200010
#define ll long long
using namespace std;
void setIO(string s)
{
string in=s+".in";
freopen(in.c_str(),"r",stdin);
}
struct cir
{
ll x,y,r;
}c[maxn];
struct use
{
int p,x,k;
}q[maxn<<1];
set<use>S;
set<use>::iterator it;
int n;
ll temp,g[maxn],ans;
ll calc(ll x) { return x * x; }
bool cmp(use a,use b)
{
return a.x < b.x;
}
bool operator<(use a,use b)
{
double x = c[a.p].y + a.k * sqrt(calc(c[a.p].r) - calc(temp - c[a.p].x));
double y = c[b.p].y + b.k * sqrt(calc(c[b.p].r) - calc(temp - c[b.p].x));
return x==y ? a.k<b.k : x < y;
}
int main()
{
// setIO("input");
int n;
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%lld%lld%lld",&c[i].x,&c[i].y,&c[i].r);
q[(i<<1)-1]=use{i,c[i].x-c[i].r,1}; // 上圆弧
q[i<<1]={i,c[i].x+c[i].r,-1}; // 下圆弧
}
sort(q+1,q+(n<<1)+1,cmp); // 按照横坐标排序
for(int i=1;i<=(n<<1);++i)
{
temp=q[i].x;
if(q[i].k==1)
{
it=S.upper_bound(use{q[i].p,0,-1});
if(it==S.end()) g[q[i].p]=1;
else
{
if((*it).k==-1) g[q[i].p]=g[(*it).p];
else
{
g[q[i].p]=-g[(*it).p];
}
}
S.insert(use{q[i].p,0,1});
S.insert(use{q[i].p,0,-1});
}
else
{
S.erase(use{q[i].p,0,1});
S.erase(use{q[i].p,0,-1});
}
}
for(int i=1;i<=n;++i)
{
ans += calc(c[i].r) * g[i];
}
printf("%lld\n",ans);
return 0;
}
BZOJ 4561: [JLoi2016]圆的异或并 扫描线 + set的更多相关文章
- BZOJ 4561 [JLoi2016]圆的异或并 ——扫描线
扫描线的应用. 扫描线就是用数据结构维护一个相对的顺序不变,带修改的东西. 通常只用于一次询问的情况. 抽象的看做一条垂直于x轴直线从左向右扫过去. 这道题目要求求出所有圆的异或并. 所以我们可以求出 ...
- bzoj 4561: [JLoi2016]圆的异或并
Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面 积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个 ...
- 【BZOJ4561】[JLoi2016]圆的异或并 扫描线
[BZOJ4561][JLoi2016]圆的异或并 Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面积并.异或面积并为:当一 ...
- 【BZOJ】4561: [JLoi2016]圆的异或并
题解 我们把圆拆成两个圆弧,按照圆弧的左右端点排序来增加和删除 那么我们把圆弧按照纵坐标排序,一定是两两不相交的 我们新加入一个圆的时候,找上圆弧的前驱,如果前驱是一个上圆弧,那么这个上圆弧所在的圆就 ...
- [BZOJ4561][JLOI2016]圆的异或并(扫描线)
考虑任何一条垂直于x轴的直线,由于圆不交,所以这条直线上的圆弧构成形似括号序列的样子,且直线移动时圆之间的相对位置不变. 将每个圆拆成两边,左端加右端删.每次加圆时考虑它外面最内层的括号属于谁.用se ...
- bzoj4561: [JLoi2016]圆的异或并 圆的扫描线
地址:http://www.lydsy.com/JudgeOnline/problem.php?id=4561 题目: 4561: [JLoi2016]圆的异或并 Time Limit: 30 Sec ...
- BZOJ4561 JLoi2016 圆的异或并 【扫描线】【set】*
BZOJ4561 JLoi2016 圆的异或并 Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面积并.异或面积并为:当一片区 ...
- bzoj4561: [JLoi2016]圆的异或并
Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面 积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个 ...
- [JLOI2016]圆的异或并
Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个圆 ...
随机推荐
- [Vue @Component] Pass Props Between Components with Vue Slot Scope & renderless component
Components with slots can expose their data by passing it into the slot and exposing the data using ...
- java JDBC 连接数据库查询数据与直接使用sql的疑问
JDBC 封装连接是好的前提: SystemAuthorizingRealm c = new SystemAuthorizingRealm(); conn = c.getConnection(); / ...
- QT如何修改字符编码格式
编辑-Select Encoding,然后在弹出窗口中修改字符编码.
- JWPlayer Uncaught Error: Invalid SRT file
错误场景: JWPlayer 播放视频,加入了字幕和缩略图: 字幕为Srt格式: 1 00:00:00,000 --> 00:00:02,000 战略管理过程 2 00:00:03,000 -- ...
- Hibernate——三种状态的理解
在Hibernate中有三种状态,对这三种状态的深入的理解,能够更好的理解Hibernate的执行机制. 在整个Hibernate中这三种状态是能够进行转换的. 1.Transient Object( ...
- iOS 设置启动页面 时间
[NSThread sleepForTimeInterval:3.0]; 时间越大 ,启动页面停留的时间越长 iOS 8之后,,创建项目自带的有 LaunchScreen.xib 可直接用
- 第一章--linux基础
(一):linux系统根文件夹结构 Unix-like系统中的"文件系统"的概念包含两个意思,第一个是"根文件系统",第二个是"存储类文件系统&quo ...
- C# 数组转换为DataTable 的三个方法
C# 数组转换为DataTable 的三个方法 using System; using System.Data; namespace ArrayToDataTable { class ArrayT ...
- E20170924-hm
literal adj. 照字面的; 原义的; 逐字的; 平实的,避免夸张; n. [印] 错排,文字上的错误; parameter n. [数] 参数; <物><数&g ...
- 知识记忆1:标志寄存器PSW
8086CPU的flag寄存器结构如下: [ ] [ ] [ ] [ ] [OF][DF][IF][TF][SF][ZF][ ][AF][ ][PF][ ][CF] 其中debug中的显示为: 标志 ...