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 }
  • 相关阅读:
    PAT顶级 1015 Letter-moving Game (35分)
    PAT顶级 1008 Airline Routes (35分)(有向图的强连通分量)
    PAT顶级 1025 Keep at Most 100 Characters (35分)
    PAT顶级 1027 Larry and Inversions (35分)(树状数组)
    PAT 顶级 1026 String of Colorful Beads (35分)(尺取法)
    PAT顶级 1009 Triple Inversions (35分)(树状数组)
    Codeforces 1283F DIY Garland
    Codeforces Round #438 A. Bark to Unlock
    Codeforces Round #437 E. Buy Low Sell High
    Codeforces Round #437 C. Ordering Pizza
  • 原文地址:https://www.cnblogs.com/Recoder/p/5443879.html
Copyright © 2011-2022 走看看