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

  1. /* 1542 */
  2. #include <iostream>
  3. #include <string>
  4. #include <map>
  5. #include <queue>
  6. #include <set>
  7. #include <stack>
  8. #include <vector>
  9. #include <deque>
  10. #include <algorithm>
  11. #include <cstdio>
  12. #include <cmath>
  13. #include <ctime>
  14. #include <cstring>
  15. #include <climits>
  16. #include <cctype>
  17. #include <cassert>
  18. #include <functional>
  19. #include <iterator>
  20. #include <iomanip>
  21. using namespace std;
  22. //#pragma comment(linker,"/STACK:102400000,1024000")
  23.  
  24. #define sti set<int>
  25. #define stpii set<pair<int, int> >
  26. #define mpii map<int,int>
  27. #define vi vector<int>
  28. #define pii pair<int,int>
  29. #define vpii vector<pair<int,int> >
  30. #define rep(i, a, n) for (int i=a;i<n;++i)
  31. #define per(i, a, n) for (int i=n-1;i>=a;--i)
  32. #define clr clear
  33. #define pb push_back
  34. #define mp make_pair
  35. #define fir first
  36. #define sec second
  37. #define all(x) (x).begin(),(x).end()
  38. #define SZ(x) ((int)(x).size())
  39. #define lson l, mid, rt<<1
  40. #define rson mid+1, r, rt<<1|1
  41.  
  42. typedef struct segment_t {
  43. double l, r, h;
  44. int f;
  45.  
  46. friend bool operator< (const segment_t& a, const segment_t& b) {
  47. return a.h < b.h;
  48. }
  49.  
  50. } segment_t;
  51.  
  52. typedef struct {
  53. int l, r, c;
  54. double len;
  55. } node_t;
  56.  
  57. const int maxn = ;
  58. double X[maxn];
  59. segment_t seg[maxn];
  60. node_t nd[maxn<<];
  61.  
  62. void build(int l, int r, int rt) {
  63. nd[rt].l = l;
  64. nd[rt].r = r;
  65. nd[rt].c = ;
  66. nd[rt].len = ;
  67.  
  68. if (l == r)
  69. return ;
  70.  
  71. int mid = (l + r) >> ;
  72. build(lson);
  73. build(rson);
  74. }
  75.  
  76. void PushUp(int rt) {
  77. if (nd[rt].c)
  78. nd[rt].len = X[nd[rt].r+] - X[nd[rt].l];
  79. else if (nd[rt].r == nd[rt].l)
  80. nd[rt].len = ;
  81. else
  82. nd[rt].len = nd[rt<<].len + nd[rt<<|].len;
  83. }
  84.  
  85. void update(int L, int R, int delta, int rt) {
  86. if (L<=nd[rt].l && nd[rt].r<=R) {
  87. nd[rt].c += delta;
  88. PushUp(rt);
  89. return ;
  90. }
  91.  
  92. int mid = (nd[rt].l + nd[rt].r) >> ;
  93.  
  94. if (mid >= R) {
  95. update(L, R, delta, rt<<);
  96. } else if (mid < L) {
  97. update(L, R, delta, rt<<|);
  98. } else {
  99. update(L, R, delta, rt<<);
  100. update(L, R, delta, rt<<|);
  101. }
  102.  
  103. PushUp(rt);
  104. }
  105.  
  106. int main() {
  107. ios::sync_with_stdio(false);
  108. #ifndef ONLINE_JUDGE
  109. freopen("data.in", "r", stdin);
  110. freopen("data.out", "w", stdout);
  111. #endif
  112.  
  113. int n, m, xn;
  114. double x1, x2, y1, y2;
  115. double ans;
  116. int L, R;
  117. int tt = ;
  118.  
  119. while (scanf("%d",&n)!=EOF && n) {
  120. ans = .;
  121. m = ;
  122. rep(i, , n) {
  123. scanf("%lf %lf %lf %lf", &x1,&y1,&x2,&y2);
  124. seg[m].l = seg[m+].l = x1;
  125. seg[m].r = seg[m+].r = x2;
  126. seg[m].h = y1;
  127. seg[m].f = ;
  128. seg[m+].h = y2;
  129. seg[m+].f = -;
  130.  
  131. X[m] = x1;
  132. X[m+] = x2;
  133.  
  134. m += ;
  135. }
  136.  
  137. sort(seg, seg+m);
  138. sort(X, X+m);
  139. xn = unique(X, X+m)-X;
  140.  
  141. build(, xn-, );
  142.  
  143. rep(i, , m) {
  144. L = lower_bound(X, X+xn, seg[i].l) - X;
  145. R = lower_bound(X, X+xn, seg[i].r) - X - ;
  146. update(L, R, seg[i].f, );
  147. ans += (seg[i+].h - seg[i].h) * nd[].len;
  148. #ifndef ONLINE_JUDGE
  149. printf("L = %d, R = %d, len = %.2lf\n", L, R, nd[].len);
  150. #endif
  151. }
  152.  
  153. printf("Test case #%d\n", ++tt);
  154. printf("Total explored area: %.02lf\n\n", ans);
  155. }
  156.  
  157. #ifndef ONLINE_JUDGE
  158. printf("time = %d.\n", (int)clock());
  159. #endif
  160.  
  161. return ;
  162. }

【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. shell 数组

    数组赋值:(1) array=(var1 var2 var3 ... varN)(2) array=([0]=var1 [1]=var2 [2]=var3 ... [n]=varN)(3) array ...

  2. CSS3滤镜!!!

    <!DOCTYPE html> <html> <head> <style> img { width: 33%; height: auto; float: ...

  3. bzoj3208:花神的秒题计划I

    思路:因为Q.S.B操作总和不超过100,因此怎么暴力怎么写....当然记忆化搜索还是要的 #include<cstdio> #include<iostream> #inclu ...

  4. Wooden Sticks

    Wooden Sticks Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total ...

  5. (转)RPC原理详解

    转自:http://www.open-open.com/lib/view/open1425797146897.html RPC功能目标 RPC的主要功能目标是让构建分布式计算(应用)更加容易,在提供强 ...

  6. Poj/OpenJudge 1094 Sorting It All Out

    1.链接地址: http://poj.org/problem?id=1094 http://bailian.openjudge.cn/practice/1094 2.题目: Sorting It Al ...

  7. hdu 4850 Wow! Such String! 欧拉回路

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4080264.html 题目链接:hdu 4850 Wow! Such String! 欧拉回 ...

  8. [转] Js获取 本周、本月、本季度、本年、上月、上周、上季度、去年时间段

    /** * 针对时间的工具类 */ var DateTimeUtil = function () { /*** * 获得当前时间 */ this.getCurrentDate = function ( ...

  9. 动态获取爱奇艺上传视频mp4格式url地址

    有时候,在工作中有些客户需要用到视频,我们大家都知道视频是非常的耗费流量的,因此,如果因为项目要求客户单独买台视频服务器是非常划不来的.那么将视频上传到优酷,爱奇艺等视频网站来托管那是一件很好的解决方 ...

  10. javascripct导图

    分别归类为: 1 .javascript变量 2. javascript运算符 3. javascript数组 4. javascript流程语句 5. javascript字符串函数 6. java ...