Picture 【HDU - 1828】【对于扫描线更新的一些特殊情况】

2023-10-30

题目链接


这个问题,在以前写过博客,但是今朝再来看,属实还存有一些问题未曾解决

举个例子,我们来画一张图,并且给每个边标个序号。

  如图,我们有4条边,按照之前想的办法,我们进行处理,我们先放进去1这号边,再放入2这号边,实际上,这时候我们已经把下面的那个矩形块的周长完全计算了一遍,这时候其实我们已经算了2号的这条边,但是呢,我们再放进去3这号边的时候,其实又要去把3这号边的值给计算一遍,而且完完全全的是加3这号的边,那么实际上就把2这条边连续加了两次,而实际上呢,它并未产生贡献。

  虽然,不经过这样的考虑也是可以AC的,弱数据(可能是随机数造的吧开森),但是今天突然被问到这个,于是想到了,扫描线确实还有一些小细节尤为重要,现在写下来,自省。

  处理的方式呢?我们不妨在同等的高度上,我们先放进去要增入的边,在减去其余的边,我们就可以让那些由于先减后删多出来的贡献给消除掉了。所以,在对于y的排序上,我们先考虑y是否相同,若是相同了,我们先放入“val == 1”的加的部分,然后再是“val == -1”的减的部分。

放上数据(比较的强)

47
-1155 -1105 -285 -930
-1115 -765 -375 -615
-480 -705 -285 -165
-1200 -705 -1025 -175
-1105 -275 -385 -105
-1165 -10 -285 185
-1160 315 -710 400
-1195 340 -1070 655
-1140 580 -265 655
-480 325 -335 395
-390 365 -265 620
-770 365 -665 610
-1195 815 -1070 1110
-760 825 -660 1100
-405 810 -275 1115
-700 780 -360 860
-695 1065 -360 1130
-1110 775 -735 860
-1110 1070 -730 1145
-95 -1065 260 140
80 -725 460 750
-135 135 840 490
-135 135 750 490
40 -520 945 -210
620 -595 695 215
-5 670 610 855
-75 550 -25 830
240 815 370 1085
-90 980 145 1125
150 280 315 490
-155 -1035 -90 -845
815 855 1030 950
980 785 1165 860
985 945 1160 1015
835 730 895 1075
695 875 790 935
420 -1165 650 -520
815 -1090 945 -210
800 -130 1160 65
980 120 1150 690
995 -1140 1180 -125
1050 -825 1135 -195
865 -90 1090 10
1045 280 1090 625
1065 -655 1115 -245
70 -1155 315 -790
110 -1005 225 -825

 

ans = 37000

 

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x3f3f3f3f
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int maxN = 1e4 + 5;
int N, num, cnt_x, X[maxN], lazy[maxN<<2];
struct node
{
    int lx, rx, y, val;
    node(int a=0, int b=0, int c=0, int d=0):lx(a), rx(b), y(c), val(d) {}
}line[maxN];
bool cmp(node e1, node e2) { return e1.y == e2.y ? e1.val > e2.val : e1.y < e2.y; }
struct TREE
{
    int val, range; //val是此时该段被覆盖次数
    bool lc, rc;
    TREE(int a=0, bool b=false, bool c=false, int d=0, int f=0):val(a), lc(b), rc(c), range(d) {}
}tree[maxN<<2];
inline void buildTree(int rt, int l, int r)
{
    lazy[rt] = 0;
    tree[rt] = TREE();
    if(l == r) return;
    int mid = HalF;
    buildTree(Lson); buildTree(Rson);
}
void pushup(int rt, int l, int r)
{
    if(lazy[rt])
    {
        tree[rt].val = X[r + 1] - X[l];
        tree[rt].range = 1;
        tree[rt].lc = tree[rt].rc = true;
    }
    else if(l == r) tree[rt] = TREE();
    else
    {
        tree[rt].val = tree[lsn].val + tree[rsn].val;
        tree[rt].range = tree[lsn].range + tree[rsn].range;
        tree[rt].lc = tree[lsn].lc;
        tree[rt].rc = tree[rsn].rc;
        if(tree[lsn].rc && tree[rsn].lc) tree[rt].range--;
    }
}
void update(int rt, int l, int r, int ql, int qr, int val)
{
    if(ql <= l && qr >= r)
    {
        lazy[rt] += val;
        pushup(myself);
        return;
    }
    int mid = HalF;
    if(qr <= mid) update(QL, val);
    else if(ql > mid) update(QR, val);
    else { update(QL, val); update(QR, val); }
    pushup(myself);
}
inline void init()
{
    num = 0;
    cnt_x = 1;
}
int main()
{
    while(scanf("%d", &N)!=EOF)
    {
        init();
        for(int i=1; i<=N; i++)
        {
            int lx, ly, rx, ry;
            scanf("%d%d%d%d", &lx, &ly, &rx, &ry);
            line[++num] = node(lx, rx, ly, 1);
            X[num] = lx;
            line[++num] = node(lx, rx, ry, -1);
            X[num] = rx;
        }
        sort(X + 1, X + num + 1);
        sort(line + 1, line + num + 1, cmp);
        cnt_x = (int)(unique(X + 1, X + num + 1) - X - 1);
        buildTree(1, 1, cnt_x);
        ll ans = 0, las = 0;
        for(int i=1; i<num; i++)
        {
            int l = (int)(lower_bound(X + 1, X + cnt_x + 1, line[i].lx) - X);
            int r = (int)(lower_bound(X + 1, X + cnt_x + 1, line[i].rx) - X - 1);
            update(1, 1, cnt_x, l, r, line[i].val);
            ans += abs(tree[1].val - las) + tree[1].range * 2 * (line[i+1].y - line[i].y);
            las = tree[1].val;
        }
        ans += line[num].rx - line[num].lx;
        printf("%lld\n", ans);
    }
    return 0;
}

  细思极恐!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Picture 【HDU - 1828】【对于扫描线更新的一些特殊情况】 的相关文章

  • LSTM预测实例(数据集展示)

    数据集展示 load and plot dataset from pandas import read csv from pandas import datetime from matplotlib import pyplot 加载数据 d
  • uniapp小程序中input内容选中效果

    先看下效果 点击按钮选中input的内容 使用 focus 配合 selection start和selection end实现 html
  • 【Unity3D】代码移动动画优化

    设置X轴和Y轴的动画曲线 通过AnimationCurve Evaluate获取进度中X和Y移动的进度的值 控制偏移 可以根据动画曲线控制平移时候的效果 using LuaInterface using System Collections
  • 论文笔记(1)DenseBox: Unifying Landmark Localization with End to End Object Detection

    本文的贡献有一下几点 1 实现了end to end的学习 同时完成了对bounding box和物体类别的预测 2 在多任务学习中融入定位信息 提高了检测的准确率 我们先来看看他和其他几篇代表性文章之间的不同 在OverFeat 1 中提
  • 机器学习方法(四):决策树Decision Tree原理与实现技巧

    欢迎转载 转载请注明 本文出自Bin的专栏blog csdn net xbinworld 技术交流QQ群 433250724 欢迎对算法 技术 应用感兴趣的同学加入 前面三篇写了线性回归 lasso 和LARS的一些内容 这篇写一下决策树这
  • DVWA 通关笔记:JavaScript Attacks

    概述 什么是JavaScript Attack JavaScript Attack即JS攻击 攻击者可以利用JavaScript实施攻击 通关要求 提交 success 一词即可获胜 下面我们分别对Low 低级 Medium 中级 High
  • java流程控制语句

    流程控制语句 一 分支语句 1 1 流程控制语句分类 1 2 if语句 1 3 switch语句 二 循环语句 2 1 for循环语句 2 2 while循环语句 2 3 do while循环语句基本格式 2 4 三种循环的区别 2 5 跳
  • 一种基于深度学习的单导联心电信号睡眠呼吸暂停检测方法

    在R峰识别的基础上 加入S峰的识别 并论正了该策略对检测结果的有效性 1 大致方法 将数据集 ECG信号 划分为每五分钟的一个片段 为了减少噪声和信号伪影 首先对信号应用了一个有限脉冲响应 FIR 带通滤波器 使用保持8 12Hz的带通滤波
  • 【Lingo 18.0及其安装教程】

    Lingo 18 0及其安装教程 Lingo是Linear Interactive and General Optimizer的缩写 即 交互式的线性和通用优化求解器 由美国LINDO系统公司 Lindo System Inc 推出的 可以
  • 小程序使用变量的值作为变量使用

    使用同一个日期选择组件 给不同的日期选择框赋值 发现想动态的给不同的组件赋值 这时候需要根据变量中暂存的组件变量赋值 这里做一下记录 calendarSelect event this setData calendarVisable fal
  • Linux常用命令-文件操作 网络命令 性能命令

    1 1文件操作命令 改变目录 cd 查看当前路径 pwd 创建目录 mkdir tmp test 创建文件 touch tmp a txt 删除文件或文件夹 rm tmp a txt 删除文件 rm r tmp test 删除文件夹 复制文
  • table2excel 导出表格有边框,文字居中

    应项目需要 前端直接导出表格中的数据 百度找到了table2excel 很实用 但是导出的表格没有边框 且表格中的数据没有居中 网上没找到对应的办法 就自己对table2excel js做了修改 能够实现导出的表格有边框 文字居中的要求 故

随机推荐

  • python print格式化输出

    在 Python 中 以 f 或 F 前缀开始的字符串表示格式化字符串字面量 通常称为 f string 从 Python 3 6 开始引入 它们是一种在字符串中嵌入表达式的新方法 这些表达式在运行时会被评估 然后使用 将它们插入到字符串中
  • Maven项目出现 ;about:black#block

    这是因为url路径有问题 检查元素 看到action是空的 解决这个问题 就可以解决问题了 这么简单的问题 为啥没有发现 因为配了域名映射的缘故 tomact一直访问的是 该文件下的项目 而我的工程项目是放在webapps下面的 这就导致我
  • NFS服务器的搭建(文件共享)

    NFS NFS目的是让不同计算机不同操作系统之间可以彼此共享文件 采用服务器 客户端工作模式ip 在NFS服务器上将目录设置为输出目录 即共享目录 后 客户端就可以将这个目录挂载到自己系统中的某个目录下 什么是RPC守护进程 使用NFS服务
  • Qt lambda 简化你的代码 connect 写法示例 省略槽函数定义

    简述 lambda 来姆达啊 很标准哈哈 英 l md 美 l md 百度百科 Lambda 表达式 lambda expression 是一个匿名函数 Lambda表达式基于数学中的 演算得名 直接对应于其中的lambda抽象 lambd
  • 关于vue项目刷新当前页面,获取数据改变后的页面

    vue项目刷新当前页面的几种方法 vue因为生命周期的原因 很多时候碰到这种情况 页面点击修改按钮 相应需要改变的数据不改变 只有F5情况下才能刷新数据已经修改后的页面 因为虽然点击了修改数据按钮 但是vue的生命周期已经执行完了 所以页面
  • 人脸检测、对齐、跟踪、识别 论文收集

    转自 https github com ChanChiChoi awesome Face Recognition
  • 目标检测算法FPN(Feature Pyramid Networks)简介

    目标检测算法Feature Pyramid Networks FPN 由Tsung Yi Lin等人于2017年提出 论文名字为 Feature Pyramid Networks for Object Detection 可以从https
  • SLAM笔记(七)回环检测中的词袋BOW

    1 词频 摘自阮一峰博客 参见附录参考 如果某个词很重要 它应该在这篇文章中多次出现 于是 我们进行 词频 Term Frequency 缩写为TF 统计 考虑到文章有长短之分 为了便于不同文章的比较 进行 词频 标准化 一般分母设置为文章
  • Centos7镜像下载教程(2023年,4月)

    一 因为Centos官网是挂在国外的服务器上 下载镜像时相比于国内的下载速度会慢很多 所以在这里向大家分享两个国内的镜像站去下载Centos镜像 二 前往阿里云镜像站下载Centos7镜像 1 阿里云官网地址 https www aliyu
  • 广度/宽度优先搜索(BFS)

    转自 https blog csdn net raphealguo article details 7523411 1 前言 广度优先搜索 也称宽度优先搜索 缩写BFS 以下采用广度来描述 是连通图的一种遍历策略 因为它的思想是从一个顶点V
  • js回调函数(callback)

    回调函数 其实简单理解的话就是在一个函数执行完毕后 得到想要的特定数据后在去执行的函数 我门直接看示例 2 getdata check 运行getdata函数 实参为check函数 1 function getdata callback 这
  • Beautiful Soup 安装教程(学习python爬虫必备库)

    文章目录 Beautiful Soup 库 一 安装 1 通过 pip 安装 2 下载安装包安装 二 验证 三 其它系统安装方式 Linux 和 Mac 1 Linux 系统基本安装方法 2 Mac 系统基本安装方法 相关链接 Beauti
  • openpyxl-(操作Excel)

    文档 https openpyxl readthedocs io en stable index html 注意事项 1 查看正在打开的excel表格就不会报错 但是 如果操作正在打开的excel表格 就会报错 写入异常 因为你正在打开当前
  • 嵌入式开发八:ARM cortex A8/9 - Android NDK - NEON介绍以及优化

    ARM cortex A8 9 Android NDK NEON介绍以及优化 资源的整理总结 1 What is NDK Android开发官网介绍 http developer android com sdk ndk overview h
  • 结构体中的函数指针(c语言里一种思想)

    阅读raft源码的时候看到结构体里面的void xx 看不懂这个地方 看上去又像面向对象的类方法 但是这是c语言的结构体啊 了解了这是函数指针 小趴菜 一 函数指针 函数指针是指向函数的指针变量 通常我们说的指针变量是指向一个整型 字符型或
  • 图片URL转Base64,Base64转二进制文件流

    现在的项目中对于图片的处理很多 对于图片的URL转Base64或者Base64转文件流很是不好处理 下面我总结了这两种方法互转的代码 希望对你有所帮助 图片URL 转Base64 function getBase64Image img va
  • Python模块Collection——OrderedDict

    OrderedDict 有序字典 OrderedDict是dict的子类 它记住了内容添加的顺序 import collections print Regular dictionary d d a A d b B d c C for k v
  • 用Python实现双目立体匹配SAD算法

    SAD Sum of absolute differences 是一种图像匹配算法 SAD算法的基本流程 1 构造一个小窗口 类似与卷积核 2 用窗口覆盖左边的图像 选择出窗口覆盖区域内的所有像素点 3 同样用窗口覆盖右边的图像并选择出覆盖
  • 基于Matlab的时间序列(Time Series)(附代码)

    时间序列 一 模型介绍 1 1 时间序列的不同分类 1 2 时间序列构成要素 1 3 三种时间序列模型 1 3 1 AR p 模型 1 3 2 MA q 模型 1 3 3 ARMA p q 模型 1 3 4 ARIMA p d q 模型 1
  • Picture 【HDU - 1828】【对于扫描线更新的一些特殊情况】

    题目链接 这个问题 在以前写过博客 但是今朝再来看 属实还存有一些问题未曾解决 举个例子 我们来画一张图 并且给每个边标个序号 如图 我们有4条边 按照之前想的办法 我们进行处理 我们先放进去1这号边 再放入2这号边 实际上 这时候我们已经