zoukankan      html  css  js  c++  java
  • 矩阵面积并

    裸裸的题目

    但是按之前的搞法 重叠的边(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
  • 相关阅读:
    tuple-1
    禅语-1
    综述的写作技巧-1
    皆大欢喜组合
    类和对象-3
    双棍练习
    CodeBlocks开发环境使用-1
    类和对象-2
    类和对象-1
    13-归并排序-分治策略应用于排序
  • 原文地址:https://www.cnblogs.com/oscar-cnblogs/p/8670388.html
Copyright © 2011-2022 走看看