【HDOJ】1542 Atlantis
离散化+线段树+扫描线,求覆盖面积。
/* 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的更多相关文章
- 【HDOJ】4729 An Easy Problem for Elfness
其实是求树上的路径间的数据第K大的题目.果断主席树 + LCA.初始流量是这条路径上的最小值.若a<=b,显然直接为s->t建立pipe可以使流量最优:否则,对[0, 10**4]二分得到 ...
- 【POJ】1151 Atlantis(线段树)
http://poj.org/problem?id=1151 经典矩形面积并吧.....很简单我就不说了... 有个很神的地方,我脑残没想到: 将线段变成点啊QAQ这样方便计算了啊 还有个很坑的地方, ...
- 【HDOJ】【3506】Monkey Party
DP/四边形不等式 裸题环形石子合并…… 拆环为链即可 //HDOJ 3506 #include<cmath> #include<vector> #include<cst ...
- 【HDOJ】【3516】Tree Construction
DP/四边形不等式 这题跟石子合并有点像…… dp[i][j]为将第 i 个点开始的 j 个点合并的最小代价. 易知有 dp[i][j]=min{dp[i][j] , dp[i][k-i+1]+dp[ ...
- 【HDOJ】【3480】Division
DP/四边形不等式 要求将一个可重集S分成M个子集,求子集的极差的平方和最小是多少…… 首先我们先将这N个数排序,容易想到每个自己都对应着这个有序数组中的一段……而不会是互相穿插着= =因为交换一下明 ...
- 【HDOJ】【2829】Lawrence
DP/四边形不等式 做过POJ 1739 邮局那道题后就很容易写出动规方程: dp[i][j]=min{dp[i-1][k]+w[k+1][j]}(表示前 j 个点分成 i 块的最小代价) $w(l, ...
- 【HDOJ】【3415】Max Sum of Max-K-sub-sequence
DP/单调队列优化 呃……环形链求最大k子段和. 首先拆环为链求前缀和…… 然后单调队列吧<_<,裸题没啥好说的…… WA:为毛手写队列就会挂,必须用STL的deque?(写挂自己弱……s ...
- 【HDOJ】【3530】Subsequence
DP/单调队列优化 题解:http://www.cnblogs.com/yymore/archive/2011/06/22/2087553.html 引用: 首先我们要明确几件事情 1.假设我们现在知 ...
- 【HDOJ】【3068】最长回文
Manacher算法 Manacher模板题…… //HDOJ 3068 #include<cstdio> #include<cstring> #include<cstd ...
随机推荐
- Hudson的安装配置
Hudson的安装配置 目录 一.正文... 2 1.安装配置jdk. 2 2.安装配置tomcat7. 2 3.安装Hudson. 2 4.启动tomcat. 2 5.初识Hudson. 3 6 ...
- CKRule BRMS-决策表使用说明
决策表的编辑有2个步骤,即规则包编辑.规则数据设置和发布. 1. 规则包编辑 双击CKBoot.exe打开CKRule规则引擎编辑界面.点新建,在左侧的工程窗口中,就会出现一个新的规则包.点击根结 ...
- Android笔记之adb命令应用实例1(手机端与PC端socket通讯上)
Android端的代码: 布局文件:activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/ ...
- 常用AWK命令
常用AWK命令 Awk is a programming language which allows easy manipulation of structured data and the gene ...
- windows下vs2013使用C++访问redis
刚开始在windows下使用c++访问reids各种报错,经过网上到处搜方案,终于可以在windows下访问redis了,特将注意事项记录下来: 1.获取redis Window下的开发库源码,从gi ...
- 安卓Handler机制的例子
Handler机制是实现线程之间通讯的一种很常见的方法,很多时候都会用到. package com.lab.activity; import android.app.Activity; import ...
- TweenMax动画库学习(二)
目录 TweenMax动画库学习(一) TweenMax动画库学习(二) TweenMax动画库学习(三) Tw ...
- sql server 2008数据复制方法
发布订阅份为两个步骤:1.发布.2.订阅.首先在数据源数据库服务器上对需要同步的数据进行发布,然后在目标数据库服务器上对上述发布进行订阅.发布可以发布一张表的部分数据,也可以对整张表进行发布.下面分别 ...
- memcached 在windows下安装及启动
memcached 在windows下安装及启动 Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数, ...
- 如何使用ERStudio 生成comment
在ER使用中,在生成sql过程中,如何批量生成字段描述,如何批量添加Owner,请看下文: 1.ER生成字段描述 2.ER生成描述添加Owner 使用的ER版本是8.0,英文版本,在操作过程中,有些配 ...