矩阵面积并

裸裸的题目

但是按之前的搞法 重叠的边(cnt >= 2)在线段树里面有没有更新到子树

所以在线段树更新里面重了两个update

时间复杂度退化了 时间有点慢

太菜了。。。

  1 #include <bits/stdc++.h>
  2 #include <string.h>
  3 #include <iostream>
  4 #include <stdio.h>
  5 #define pb push_back
  6 #define fi first
  7 #define se second
  8 #define lson(r) (r<<1)
  9 #define rson(r) ((r<<1)|1)
 10 
 11 using namespace std;
 12 
 13 typedef long long ll;
 14 
 15 const int MAXN = 2e3+7;
 16 const int MAXV = 507;
 17 const int MAXE = 507;
 18 
 19 struct Seg
 20 {
 21     int cnt;
 22     double len;
 23 }seg[MAXN << 2];
 24 struct Line
 25 {
 26     double px1, px2, h;
 27     int x1, x2, flag;
 28     Line() {}
 29     Line(double px1, double px2, double h, int flag) : px1(px1), px2(px2), h(h), flag(flag) {}
 30     bool operator < (Line l) const
 31     {
 32         return h < l.h;
 33     }
 34 }line[MAXN];
 35 double hor[MAXN];
 36 int n;
 37 
 38 void push_up(int root, int l, int r)
 39 {
 40     if (seg[root].cnt >= 2) seg[root].len = hor[r+1] - hor[l];
 41     else if (l == r) seg[root].len = 0;
 42     else seg[root].len = seg[lson(root)].len + seg[rson(root)].len;
 43 }
 44 void update(int root, int l, int r, int ul, int ur, int addval)
 45 {
 46     if (l > ur || r < ul) return ;
 47     if (l >= ul && r <= ur)
 48     {
 49         seg[root].cnt += addval;
 50         //cout << l << " " << r << " " << seg[root].cnt << endl;
 51         int mid = (l+r) >> 1;
 52         if (l == r)
 53         {
 54             push_up(root, l, r);
 55             return ;
 56         }
 57                 //在区间内也更新
 58         update(lson(root), l, mid, ul, ur, addval); 
 59         update(rson(root), mid+1, r, ul, ur, addval);
 60         push_up(root, l, r);
 61         return;
 62     }
 63     int mid = (l+r) >> 1;
 64     update(lson(root), l, mid, ul, ur, addval);
 65     update(rson(root), mid+1, r, ul, ur, addval);
 66     push_up(root, l, r);
 67 }
 68 double query()
 69 {
 70     return seg[1].len;
 71 }
 72 int main()
 73 {
 74     //freopen("in.txt", "r", stdin);
 75     int T;
 76     scanf("%d", &T);
 77     while (T--)
 78     {
 79         scanf("%d", &n);
 80         int num = 0;
 81         memset(line, 0, sizeof(line));
 82         memset(hor, 0, sizeof(hor));
 83         memset(seg, 0, sizeof(seg));
 84         for (int i = 0; i < n; i++)
 85         {
 86             double x1, x2, y1, y2;
 87             scanf("%lf%lf%lf%lf", &x1, &y1, &x2, &y2);
 88             hor[num] = x1;
 89             line[num++] = Line(x1, x2, y1, 1);
 90             hor[num] = x2;
 91             line[num++] = Line(x1, x2, y2, -1);
 92         }
 93         sort(line, line+num);
 94         sort(hor, hor+num);
 95         int m = unique(hor, hor+num) - hor;
 96         for (int i = 0; i < num; i++)
 97         {
 98             line[i].x1 = lower_bound(hor, hor+m, line[i].px1) - hor;
 99             line[i].x2 = lower_bound(hor, hor+m, line[i].px2) - hor;
100         }
101         double ans = 0, prey = -1;
102         for (int i = 0; i < num; i++)
103         {
104             if (prey == -1)
105             {
106                 prey = line[i].h;
107                 update(1, 0, m-2, line[i].x1, line[i].x2-1, line[i].flag);
108                 //cout << line[i].
109                 //x1 << " " << line[i].x2 << endl;
110                 continue;
111             }
112             double det = line[i].h - prey; 
113             double len = query();
114             ans += len * det;
115             prey = line[i].h;
116                 //cout << line[i].x1 << " " << line[i].x2 << endl;
117             update(1, 0, m-2, line[i].x1, line[i].x2-1, line[i].flag);
118             //return 0;
119         }
120         printf("%.2f
", ans);
121     }
122     return 0;
123 }
View Code
原文地址:https://www.cnblogs.com/oscar-cnblogs/p/8670388.html