zoukankan      html  css  js  c++  java
  • HDU 1255 覆盖的面积 (线段树+扫描线+离散化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255

    题意很清楚,就是让你求矩阵之间叠加层数大于1的矩形块的面积和。

    因为n只有1000,所以我离散化一下,数据大小就缩小了,那么之后只需要线段树单点更新就好了。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <map>
     5 #include <algorithm>
     6 using namespace std;
     7 const int MAXN = 4e3 + 5;
     8 struct data {
     9     int x1 , x2 , flag;
    10     double y , xx1 , xx2;
    11     bool operator <(const data& cmp) const {
    12         return y < cmp.y;
    13     }
    14 }a[MAXN];
    15 struct segtree {
    16     int l , r , add;
    17     double val;
    18 }T[MAXN << 2];
    19 double x[MAXN];
    20 map <double , int> mp;
    21 
    22 void build(int p , int l , int r) {
    23     int mid = (l + r) >> 1;
    24     T[p].val = T[p].add = 0 , T[p].l = l , T[p].r = r;
    25     if(r - l == 1) {
    26         return ;
    27     }
    28     build(p << 1 , l , mid);
    29     build((p << 1)|1 , mid , r);
    30 }
    31 
    32 void updata(int p , int l , int r , int val) {
    33     int mid = (T[p].l + T[p].r) >> 1;
    34     if(T[p].r - T[p].l == 1) {
    35         T[p].add += val;
    36         if(T[p].add > 1)
    37             T[p].val = x[T[p].r] - x[T[p].l];
    38         else
    39             T[p].val = 0;
    40         return ;
    41     }
    42     if(r <= mid) {
    43         updata(p << 1 , l , r , val);
    44     }
    45     else if(l >= mid) {
    46         updata((p << 1)|1 , l , r , val);
    47     }
    48     else {
    49         updata(p << 1 , l , mid , val);
    50         updata((p << 1)|1 , mid , r , val);
    51     }
    52     T[p].val = T[p << 1].val + T[(p << 1)|1].val;
    53 }
    54 
    55 int main()
    56 {
    57     int t = 1 , n;
    58     double x1 , x2 , y1 , y2;
    59     scanf("%d" , &t);
    60     while(t--) {
    61         mp.clear();
    62         scanf("%d" , &n);
    63         int cnt = 0;
    64         for(int i = 0 ; i < n ; i++) {
    65             scanf("%lf %lf %lf %lf" , &x1 , &y1 , &x2 , &y2);
    66             if(x1 > x2)
    67                 swap(x1 , x2);
    68             if(y1 > y2)
    69                 swap(y1 , y2);
    70             int ls = i * 2 , rs = i * 2 + 1;
    71             a[ls].xx1 = x1 , a[ls].xx2 = x2 , a[ls].y = y1 , a[ls].flag = 1;
    72             a[rs].xx1 = x1 , a[rs].xx2 = x2 , a[rs].y = y2 , a[rs].flag = -1;
    73             if(!mp[x1]) {
    74                 mp[x1] = 1;
    75                 x[++cnt] = x1;
    76             }
    77             if(!mp[x2]) {
    78                 mp[x2] = 1;
    79                 x[++cnt] = x2;
    80             }
    81         }
    82         sort(a , a + n * 2);
    83         sort(x + 1 , x + cnt + 1);
    84         for(int i = 0 ; i < n * 2 ; i++) {
    85             a[i].x1 = lower_bound(x + 1 , x + cnt + 1 , a[i].xx1) - x;
    86             a[i].x2 = lower_bound(x + 1 , x + cnt + 1 , a[i].xx2) - x;
    87         }
    88         double res = 0;
    89         build(1 , 1 , cnt);
    90         updata(1 , a[0].x1 , a[0].x2 , a[0].flag);
    91         for(int i = 1 ; i < 2 * n ; i++) {
    92             res += (a[i].y - a[i - 1].y) * T[1].val;
    93             updata(1 , a[i].x1 , a[i].x2 , a[i].flag);
    94         }
    95         printf("%.2f
    " , res);
    96     }
    97 }
  • 相关阅读:
    LeetCode 623. Add One Row to Tree
    LeetCode 894. All Possible Full Binary Trees
    LeetCode 988. Smallest String Starting From Leaf
    LeetCode 979. Distribute Coins in Binary Tree
    LeetCode 814. Binary Tree Pruning
    LeetCode 951. Flip Equivalent Binary Trees
    LeetCode 426. Convert Binary Search Tree to Sorted Doubly Linked List
    LeetCode 889. Construct Binary Tree from Preorder and Postorder Traversal
    LeetCode 687. Longest Univalue Path
    LeetCode 428. Serialize and Deserialize N-ary Tree
  • 原文地址:https://www.cnblogs.com/Recoder/p/5443879.html
Copyright © 2011-2022 走看看