首页 > 其他分享 >daimayuan 矩形面积并

daimayuan 矩形面积并

时间:2024-06-12 15:12:42浏览次数:21  
标签:Yi 矩形 mincnt int daimayuan 面积 tr Xi include

#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <array>

using namespace std;

/*
http://oj.daimayuan.top/course/15/problem/688

平面上有n个矩形[Xi,1,Xi,2]×[Yi,1,Yi,2]
,也就是左下角(Xi,1,Yi,1)右上角(Xi,2,Yi,2)的矩形。问面积的并是多少。

输入格式
第一行一个整数n(1≤n≤2×105)。

接下来n行,每行四个整数X1,X2,Y1,Y2(1≤X1≤X2≤109,1≤Y1≤Y2≤109)。

注意:可能会有空矩形。

输出格式
输出一个数表示答案。

样例输入
2
1 4 2 3
2 3 1 4
样例输出
5
*/

const int N = 200010;
struct NODE {
    int l, r;
    //int minv, mincnt;
    int lazy;
    int mincnt, len;
}tr[N*4];
vector<int> ys;
vector<array<int, 4>> seg;
int n, m;

void update(int u) {
    tr[u].mincnt = min(tr[u << 1].mincnt, tr[u << 1 | 1].mincnt);
    if (tr[u << 1].mincnt == tr[u << 1 | 1].mincnt) {
        tr[u].len = tr[u << 1].len + tr[u << 1 | 1].len;
    }
    else if (tr[u << 1].mincnt < tr[u << 1 | 1].mincnt) {
        tr[u].len = tr[u << 1].len;
    }
    else {
        tr[u].len = tr[u << 1|1].len;
    }
}

void build(int u, int l, int r) {
    tr[u] = { l, r, 0, 0, 0 };
    if (l == r) {
        tr[u] = { l, r, 0, 0, ys[l + 1] - ys[l] };
    }
    else {
        int mid = l + r >> 1;
        build(u << 1, l, mid);
        build(u << 1 | 1, mid + 1, r);
        update(u);
    }
}

void pushdown(int u) {
    int k = tr[u].lazy;
    if (tr[u].lazy) {
        tr[u<<1].mincnt = tr[u<<1].mincnt + k;
        tr[u<<1].lazy = tr[u<<1].lazy + k;
        tr[u << 1|1].mincnt = tr[u << 1|1].mincnt + k;
        tr[u << 1|1].lazy = tr[u << 1|1].lazy + k;
        tr[u].lazy = 0;
    }
}

void modify(int u, int l, int r, int k) {
    if (l <= tr[u].l && r >= tr[u].r) {
        tr[u].mincnt = tr[u].mincnt + k;
        tr[u].lazy = tr[u].lazy + k;
    }
    else {
        int mid = tr[u].l + tr[u].r >> 1;
        pushdown(u);
        if (l <= mid) modify(u << 1, l, r, k);
        if (r > mid) modify(u << 1 | 1, l, r, k);
        update(u);
    }
}


int main() {
    scanf("%d",&n);
    int idx = 1; 
    ys.push_back(-1);
    seg.push_back({ -1,-1,-1,-1 });
    for (int i = 1; i <= n; i++) {
        int x1, y1, x2, y2; 
        scanf("%d%d%d%d", &x1, &x2, &x2, &y2);
        ys.push_back(y1); ys.push_back(y2);
        seg.push_back({ x1,1,y1,y2 });
        seg.push_back({ x2,-1,y1,y2 });
    }

    sort(ys.begin(), ys.end());
    sort(seg.begin(), seg.begin());
    ys.erase(unique(ys.begin(), ys.end()), ys.end());
    m = ys.size() - 2;

    build(1, 1, m);

    long long ans = 0;
    int totalLen = tr[1].len;
    int prex = 0;
    for (int i = 1; i < seg.size(); i++) {
        int cov = totalLen;
        if (tr[1].mincnt == 0) {
            cov = totalLen - tr[1].len;
        }
        ans += 1ll * (seg[i][0] - prex) * cov;
        prex = seg[i][0];
        int y1 = lower_bound(ys.begin(), ys.end(), seg[i][2]) - ys.begin() ;
        int y2 = lower_bound(ys.begin(), ys.end(), seg[i][3]) - ys.begin() ;
        modify(1, y1, y2, seg[i][1]);
    }

    printf("%lld\n", ans);


    return 0;
}

标签:Yi,矩形,mincnt,int,daimayuan,面积,tr,Xi,include
From: https://www.cnblogs.com/itdef/p/18243981

相关文章

  • 【数学】各种图面积公式的推导
    Hello!大家好,我是@学霸小羊,今天讲讲面积公式。1.长方形长方形是由无数条长度为长方形的长(或宽)的线组成的图形,这些线有多少根,我们不知道,只需要知道他们垒成了一个由高宽(或长)组成的面。由此可得一条公式:长方形面积=长×宽 S=ab2.正方形正方形的边长相等,可以理解为长和......
  • 华为OD刷题C卷 - 每日刷题 22(计算面积、绘图机器,信道分配)
    1、(计算面积、绘图机器):这段代码是解决“计算面积、绘图机器”的问题。它提供了一个Java类Main,其中包含main方法,用于计算绘图机器按照给定指令绘制直线所形成的图形面积。main方法首先读取指令数量n和横坐标终点值end_X。然后,初始化面积和area为0,以及上一个点的坐标last_X......
  • [lnsyoj283/luoguP1856/IOI1998]矩形周长Picture
    题意原题链接求几个矩形的周长并sol遇到几何图形的**并,都可以使用扫描线思想来解决观察易得,与x轴平行的边和与y轴平行的边相互独立,因此可以扫描两次,分别计算并累加以与x轴平行的边为例:假设有一条平行于x轴的直线从下到上扫描,每当遇到一条边时,若这条边是某个矩形的下边,则在......
  • 代码随想录算法训练营Day60 | 84.柱状图中最大的矩形 | Python | 个人记录向
    注:今天是代码随想录训练营的最后一天啦!!!本文目录84.柱状图中最大的矩形做题看文章以往忽略的知识点小结个人体会84.柱状图中最大的矩形代码随想录:84.柱状图中最大的矩形Leetcode:84.柱状图中最大的矩形做题无思路。看文章与42.接雨水很像,42.接雨水是找每个......
  • Vulkan矩形绘制顺序小坑
    裁剪坐标不同:1.vulkan裁剪坐标Y朝下,所以下面矩形意义:staticstd::vector<Vertex>vertices={{{-0.5f,-0.5f,0},{1.0f,0.0f,0.0f}},//左上角{{0.5f,-0.5f,0},{0.0f,1.0f,0.0f}},//右上角{{0.5f,0.5f,0},{0.0f,0.0f,1.0f}},//右下角......
  • YOLOv8: 标注石头、识别边缘及计算面积的方案
    YOLOv8:标注石头、识别边缘及计算面积的方案引言YOLO(YouOnlyLookOnce)是一种非常有效的实时目标检测算法,自其首次发布以来就受到了广泛的关注和应用。YOLOv8是这一系列算法的最新版本,继承了之前版本的高效性和准确性,同时在模型结构和性能上进行了优化。在本文中,我们......
  • 60天【代码随想录算法训练营34期】第十章 单调栈part03 (84.柱状图中最大的矩形)
    84.柱状图中最大的矩形classSolution:deflargestRectangleArea(self,heights:List[int])->int:s=[0]result=0heights.insert(0,0)heights.append(0)foriinrange(1,len(height......
  • amCharts绘制堆叠面积图
    代码案例<!DOCTYPEhtml><html><head><scriptsrc="https://cdn.amcharts.com/lib/5/index.js"></script><scriptsrc="https://cdn.amcharts.com/lib/5/xy.js"></script><scriptsrc=&qu......
  • leetCode. 85. 最大矩形
    leetCode.85.最大矩形部分参考上一题链接leetCode.84.柱状图中最大的矩形此题思路代码classSolution{public:intlargestRectangleArea(vector<int>&h){intn=h.size();vector<int>left(n),right(n);stack<int>......
  • 在 Cognex VisionPro CogRecordDisplay 中创建交互式矩形区域
    在CognexVisionProCogRecordDisplay中创建交互式矩形区域在图像处理和视觉检测应用中,定义和操作特定区域是至关重要的。本文将演示如何在CognexVisionPro中使用C#创建一个可交互的矩形区域,并启用拖拽和调整大小功能,从而提升图像处理的灵活性和效率。前提条件安......