【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 ...
随机推荐
- shell 数组
数组赋值:(1) array=(var1 var2 var3 ... varN)(2) array=([0]=var1 [1]=var2 [2]=var3 ... [n]=varN)(3) array ...
- CSS3滤镜!!!
<!DOCTYPE html> <html> <head> <style> img { width: 33%; height: auto; float: ...
- bzoj3208:花神的秒题计划I
思路:因为Q.S.B操作总和不超过100,因此怎么暴力怎么写....当然记忆化搜索还是要的 #include<cstdio> #include<iostream> #inclu ...
- Wooden Sticks
Wooden Sticks Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total ...
- (转)RPC原理详解
转自:http://www.open-open.com/lib/view/open1425797146897.html RPC功能目标 RPC的主要功能目标是让构建分布式计算(应用)更加容易,在提供强 ...
- Poj/OpenJudge 1094 Sorting It All Out
1.链接地址: http://poj.org/problem?id=1094 http://bailian.openjudge.cn/practice/1094 2.题目: Sorting It Al ...
- hdu 4850 Wow! Such String! 欧拉回路
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4080264.html 题目链接:hdu 4850 Wow! Such String! 欧拉回 ...
- [转] Js获取 本周、本月、本季度、本年、上月、上周、上季度、去年时间段
/** * 针对时间的工具类 */ var DateTimeUtil = function () { /*** * 获得当前时间 */ this.getCurrentDate = function ( ...
- 动态获取爱奇艺上传视频mp4格式url地址
有时候,在工作中有些客户需要用到视频,我们大家都知道视频是非常的耗费流量的,因此,如果因为项目要求客户单独买台视频服务器是非常划不来的.那么将视频上传到优酷,爱奇艺等视频网站来托管那是一件很好的解决方 ...
- javascripct导图
分别归类为: 1 .javascript变量 2. javascript运算符 3. javascript数组 4. javascript流程语句 5. javascript字符串函数 6. java ...