扫描线

想法挺妙 搞了很长很长时间。。。

http://www.cppblog.com/superlong/archive/2010/08/06/122427.html

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, int> PII;
const int N = ;
int n;
ll ans, nowx;
int x[N], y[N], r[N], mark[N];
inline ll sqr(int x)
{
return (ll)x * (ll)x;
}
struct data {
int id, w;
data(int id = , int w = ) : id(id), w(w) {}
bool friend operator < (data A, data B)
{
double l1 = (double)y[A.id] + (double)A.w * sqrt(sqr(r[A.id]) - sqr(nowx - x[A.id]));
double l2 = (double)y[B.id] + (double)B.w * sqrt(sqr(r[B.id]) - sqr(nowx - x[B.id]));
return l1 == l2 ? A.w < B.w : l1 < l2;
}
};
vector<PII> v;
set<data> s;
int main()
{
scanf("%d", &n);
for(int i = ; i <= n; ++i)
{
scanf("%d%d%d", &x[i], &y[i], &r[i]);
v.push_back(make_pair((ll)x[i] - (ll)r[i], i));
v.push_back(make_pair((ll)x[i] + (ll)r[i], -i));
}
sort(v.begin(), v.end());
for(int i = ; i < v.size(); ++i)
{
PII t = v[i];
int p = t.second;
nowx = v[i].first;
if(p < )
{
s.erase(data(-p, -));
s.erase(data(-p, ));
}
else
{
set<data> :: iterator it = s.upper_bound(data(p, ));
if(it == s.end())
mark[p] = ;
else if(it -> w == )
mark[p] = -mark[it -> id];
else mark[p] = mark[it -> id];
s.insert(data(p, -));
s.insert(data(p, ));
}
}
for(int i = ; i <= n; ++i)
ans += (ll)mark[i] * (ll)r[i] * (ll)r[i];
printf("%lld\n", ans);
return ;
}

bzoj4561的更多相关文章

  1. BZOJ4561 JLOI2016圆的异或并(扫描线+平衡树)

    考虑一条扫描线从左到右扫过这些圆.观察某一时刻直线与这些圆的交点,可以发现构成一个类似括号序列的东西,括号的包含关系与圆的包含关系是相同的.并且当扫描线逐渐移动时,括号间的相对顺序不变.于是考虑用se ...

  2. [BZOJ4561][JLOI2016]圆的异或并(扫描线)

    考虑任何一条垂直于x轴的直线,由于圆不交,所以这条直线上的圆弧构成形似括号序列的样子,且直线移动时圆之间的相对位置不变. 将每个圆拆成两边,左端加右端删.每次加圆时考虑它外面最内层的括号属于谁.用se ...

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

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

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

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

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

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

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

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

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

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

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

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

  9. BZOJ4561: [JLoi2016]圆的异或并 计算几何+treap

    因为本题保证两圆之间只有相包含或相离(不用担心两圆重合 因为我没有RE) 所以每个圆之间的相对位置是确定的  也就是可以按极角排序的, 所以可以按横坐标排序后 扫描同时用treap维护加圆删圆(即遇到 ...

随机推荐

  1. PHP填坑

    这里记录下最近PHP踩过的坑,很多都是语法性错误 (1)函数结尾忘记加: 例如匿名函数 <?php $show = function($value){ echo $value."你好& ...

  2. 如何使用crash分析vmcore - 之基础思路case1

    如何使用crash分析vmcore - 之基础思路case1 dmesg查看内核日志 [2493382.671020] systemd-shutdown[1]: Sending SIGKILL to ...

  3. JavaScript ES6 数组新方法 学习随笔

    JavaScript ES6 数组新方法 学习随笔 新建数组 var arr = [1, 2, 2, 3, 4] includes 方法 includes 查找数组有无该参数 有返回true var ...

  4. C/C++野指针

    野指针: 野指针不同于空指针,空指针是指一个指针的值为null,而野指针的值并不为null,野指针会指向一段实际的内存,只是它指向哪里我们并不知情,或者是它所指向的内存空间已经被释放,所以在实际使用的 ...

  5. 匹配 C 语言样式字符串

    #include <stdio.h> char haha[] = "nihaoma" "niubi" "\"hello worl ...

  6. 1.Zigbee开发学习资源

    http://blog.csdn.net/zhanglianpin/article/details/46907349

  7. ch12 GUI

    <Head First Java 2nd Edition> 摘录 JFrame 代表屏幕上的一个窗口,可以把 buttons, checkboxes, test fields 等等界面相关 ...

  8. Codeforces Educational Codeforces Round 17 Problem.A kth-divisor (暴力+stl)

    You are given two integers n and k. Find k-th smallest divisor of n, or report that it doesn't exist ...

  9. 【C++】实现记录软件计时时间

    利用getTickCount()和getTickFrequency()函数实现计时 double time0 = static_cast<double>(getTickCount()); ...

  10. nyoj 911 Registration system(map)

    Registration system 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 A new e-mail service "Berlandesk&q ...