离散化+线段树+扫描线,求覆盖面积。

 /* 1542 */
#include <iostream>
#include <string>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#include <deque>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstring>
#include <climits>
#include <cctype>
#include <cassert>
#include <functional>
#include <iterator>
#include <iomanip>
using namespace std;
//#pragma comment(linker,"/STACK:102400000,1024000") #define sti set<int>
#define stpii set<pair<int, int> >
#define mpii map<int,int>
#define vi vector<int>
#define pii pair<int,int>
#define vpii vector<pair<int,int> >
#define rep(i, a, n) for (int i=a;i<n;++i)
#define per(i, a, n) for (int i=n-1;i>=a;--i)
#define clr clear
#define pb push_back
#define mp make_pair
#define fir first
#define sec second
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
#define lson l, mid, rt<<1
#define rson mid+1, r, rt<<1|1 typedef struct segment_t {
double l, r, h;
int f; friend bool operator< (const segment_t& a, const segment_t& b) {
return a.h < b.h;
} } segment_t; typedef struct {
int l, r, c;
double len;
} node_t; const int maxn = ;
double X[maxn];
segment_t seg[maxn];
node_t nd[maxn<<]; void build(int l, int r, int rt) {
nd[rt].l = l;
nd[rt].r = r;
nd[rt].c = ;
nd[rt].len = ; if (l == r)
return ; int mid = (l + r) >> ;
build(lson);
build(rson);
} void PushUp(int rt) {
if (nd[rt].c)
nd[rt].len = X[nd[rt].r+] - X[nd[rt].l];
else if (nd[rt].r == nd[rt].l)
nd[rt].len = ;
else
nd[rt].len = nd[rt<<].len + nd[rt<<|].len;
} void update(int L, int R, int delta, int rt) {
if (L<=nd[rt].l && nd[rt].r<=R) {
nd[rt].c += delta;
PushUp(rt);
return ;
} int mid = (nd[rt].l + nd[rt].r) >> ; if (mid >= R) {
update(L, R, delta, rt<<);
} else if (mid < L) {
update(L, R, delta, rt<<|);
} else {
update(L, R, delta, rt<<);
update(L, R, delta, rt<<|);
} PushUp(rt);
} int main() {
ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif int n, m, xn;
double x1, x2, y1, y2;
double ans;
int L, R;
int tt = ; while (scanf("%d",&n)!=EOF && n) {
ans = .;
m = ;
rep(i, , n) {
scanf("%lf %lf %lf %lf", &x1,&y1,&x2,&y2);
seg[m].l = seg[m+].l = x1;
seg[m].r = seg[m+].r = x2;
seg[m].h = y1;
seg[m].f = ;
seg[m+].h = y2;
seg[m+].f = -; X[m] = x1;
X[m+] = x2; m += ;
} sort(seg, seg+m);
sort(X, X+m);
xn = unique(X, X+m)-X; build(, xn-, ); rep(i, , m) {
L = lower_bound(X, X+xn, seg[i].l) - X;
R = lower_bound(X, X+xn, seg[i].r) - X - ;
update(L, R, seg[i].f, );
ans += (seg[i+].h - seg[i].h) * nd[].len;
#ifndef ONLINE_JUDGE
printf("L = %d, R = %d, len = %.2lf\n", L, R, nd[].len);
#endif
} printf("Test case #%d\n", ++tt);
printf("Total explored area: %.02lf\n\n", ans);
} #ifndef ONLINE_JUDGE
printf("time = %d.\n", (int)clock());
#endif return ;
}

【HDOJ】1542 Atlantis的更多相关文章

  1. 【HDOJ】4729 An Easy Problem for Elfness

    其实是求树上的路径间的数据第K大的题目.果断主席树 + LCA.初始流量是这条路径上的最小值.若a<=b,显然直接为s->t建立pipe可以使流量最优:否则,对[0, 10**4]二分得到 ...

  2. 【POJ】1151 Atlantis(线段树)

    http://poj.org/problem?id=1151 经典矩形面积并吧.....很简单我就不说了... 有个很神的地方,我脑残没想到: 将线段变成点啊QAQ这样方便计算了啊 还有个很坑的地方, ...

  3. 【HDOJ】【3506】Monkey Party

    DP/四边形不等式 裸题环形石子合并…… 拆环为链即可 //HDOJ 3506 #include<cmath> #include<vector> #include<cst ...

  4. 【HDOJ】【3516】Tree Construction

    DP/四边形不等式 这题跟石子合并有点像…… dp[i][j]为将第 i 个点开始的 j 个点合并的最小代价. 易知有 dp[i][j]=min{dp[i][j] , dp[i][k-i+1]+dp[ ...

  5. 【HDOJ】【3480】Division

    DP/四边形不等式 要求将一个可重集S分成M个子集,求子集的极差的平方和最小是多少…… 首先我们先将这N个数排序,容易想到每个自己都对应着这个有序数组中的一段……而不会是互相穿插着= =因为交换一下明 ...

  6. 【HDOJ】【2829】Lawrence

    DP/四边形不等式 做过POJ 1739 邮局那道题后就很容易写出动规方程: dp[i][j]=min{dp[i-1][k]+w[k+1][j]}(表示前 j 个点分成 i 块的最小代价) $w(l, ...

  7. 【HDOJ】【3415】Max Sum of Max-K-sub-sequence

    DP/单调队列优化 呃……环形链求最大k子段和. 首先拆环为链求前缀和…… 然后单调队列吧<_<,裸题没啥好说的…… WA:为毛手写队列就会挂,必须用STL的deque?(写挂自己弱……s ...

  8. 【HDOJ】【3530】Subsequence

    DP/单调队列优化 题解:http://www.cnblogs.com/yymore/archive/2011/06/22/2087553.html 引用: 首先我们要明确几件事情 1.假设我们现在知 ...

  9. 【HDOJ】【3068】最长回文

    Manacher算法 Manacher模板题…… //HDOJ 3068 #include<cstdio> #include<cstring> #include<cstd ...

随机推荐

  1. enum 与 #define

    enum 与 #define 一.为什么既要有enum,又要define enum is derived from enumerate, from ex- + number,字面意思就是用数字排列,报 ...

  2. BYTE、WORD与DWORD类型

    Original Link:  http://hi.baidu.com/vnxuaqndtncrxyr/item/f67c83872cf80cd65e0ec10d Author: 厚积薄发 在Visu ...

  3. hdu 1250 Hat's Fibonacci(高精度数)

    //  继续大数,哎.. Problem Description A Fibonacci sequence is calculated by adding the previous two membe ...

  4. 深度模拟java动态代理实现机制系类之一

    上一篇博客是最基本的动态代理原理的实现,因为其固定了接口,固定了代理方法,以及固定了代理的类型,接下来的博客系类将一步步渐入深度介绍java的动态代理的实现原理 ******************* ...

  5. Chrome控制台函数

    你是光你是电,你是唯一的神话. Chrome的出现简直拯救了广大前端,不仅仅是因为其V8引擎的速度,更是因为其强大的控制台.为调试前端提供了强大的武器. 当然Firefox下的firebug也很强大, ...

  6. jQuery.hhNewSilder 滚动图片插件

    /**  * jQuery.hhNewSilder 滚动图片插件  * User: huanhuan  * QQ: 651471385  * Email: th.wanghuan@gmail.com ...

  7. javascript调用外部wpf的方法

    今天因为项目需要在wpf嵌入web页面,然后在web页面调用wpf的方法,于是突击学习了一下,记下备忘.^_^ 1.wpf中新建一个类WpfForScriptingHelper namespace w ...

  8. PHP — 用PHP实现一个双向队列

    1.简介 deque,全名double-ended queue,是一种具有队列和栈的性质的数据结构.双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行.双向队列(双端队列)就像是一个队 ...

  9. phpcms前端页面上传文件

    PHPCMS其实有一个叫做附件的模块,上传用的就是这个东西,现在我们来看一下对应的文件:phpcms\modules\attachment \attachments.php就是这个文件,大概在29行上 ...

  10. Educational Codeforces Round 8 D. Magic Numbers

    Magic Numbers 题意:给定长度不超过2000的a,b;问有多少个x(a<=x<=b)使得x的偶数位为d,奇数位不为d;且要是m的倍数,结果mod 1e9+7; 直接数位DP;前 ...