• 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 }
  • 相关阅读:
    程序员修炼之道读书笔记02
    程序员修炼之道读书笔记01
    2021年1月30日 体温上报app03(百度API的获取和配置方法)
    2021年1月28日 体温上报app02
    2021年1月27日 体温上报app01
    2021年1月26日 sqlite数据库
    2021年1月25日 列表与适配器
    16.CSS margin用法
    14.CSS 块级元素与行内元素
    12.CSS 简单认识margin
  • 原文地址:https://www.cnblogs.com/Recoder/p/5443879.html
Copyright © 2020-2023  润新知