Mayor‘s posters (线段树+离散化)

2023-11-09

题目链接:Mayor’s posters

思路:由于看到l,r的值最大可达到1e7,这时候如果强行build,那么大概率会出错,看到n的值只有1e4,这时候我们应该想到用离散化去解决这个问题。
而且,这里还有一个坑点,假如所给区间为[1,4],[6,7],[1,7],那么离散化之后1,4,6,7分别对应1,2,3,4这时候如果求出海报的种类,那么就错误的求出了[1,2],[3,4]的海报种类为2。所以我们判断当两个结点的值的差大于1时,那么插入一个中间结点,就可以避免此情况。

代码:(还是y总的代码风格看起来舒服)

#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;
const int N=1e5+10;
typedef pair<int,int> p;
int idx=1;
struct node
{
    int l,r,col;
}tr[4*N];
int a[N];
vector<int> alls;
vector<p> sec;
int find(int x)
{
    int l=0,r=alls.size();
    while(l<r)
    {
        int mid=l+r>>1;
        if(x<=alls[mid])r=mid;
        else l=mid+1;
    }
    return l+1;
}
void build(int u,int l,int r)
{
    tr[u]={l,r};
    if(l==r)return;
    int mid=l+r>>1;
    build(u<<1,l,mid),build(u<<1|1,mid+1,r);
}
void pushdown(int u)
{
    node &root=tr[u],&left=tr[u<<1],&right=tr[u<<1|1];
    if(root.col&&root.l!=root.r)
    {
        left.col=root.col,right.col=root.col;
        root.col=0;
    }
}
void modify(int u,int l,int r,int k)
{
    if(l<=tr[u].l&&r>=tr[u].r)
    {
        tr[u].col=k;
    }
    else
    {
        pushdown(u);
        int mid=tr[u].l+tr[u].r>>1;
        if(l<=mid)modify(u<<1,l,r,k);
        if(r>mid)modify(u<<1|1,l,r,k);
    }
}
int query(int u)
{
    pushdown(u);
    if(tr[u].col&&!a[tr[u].col])
    {
        a[tr[u].col]=1;
        return 1;
    }
    if(tr[u].l==tr[u].r)return 0;
    int sum=0;
    sum+=query(u<<1)+query(u<<1|1);
    return sum;
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,l,r;
        cin>>n;
        idx=1;
        while(n--)
        {
            cin>>l>>r;
            alls.push_back(l),alls.push_back(r);
            sec.push_back({l,r});
        }
        sort(alls.begin(),alls.end());
        alls.erase(unique(alls.begin(),alls.end()),alls.end());
        int len=alls.size();
        for(int i=1;i<len;i++)
        {
            if(alls[i]-alls[i-1]>1)alls.push_back(alls[i-1]+1);//这就是解决那个问题的重要代码
        }

        sort(alls.begin(),alls.end());//之后再进行一次离散化
        alls.erase(unique(alls.begin(),alls.end()),alls.end());
        build(1,1,alls.size());//根据alls数组的大小来Build
        for(int i=0;i<sec.size();i++)
        {
            int ll=find(sec[i].first),rr=find(sec[i].second);//用二分查找离散化后对应的位置
            modify(1,ll,rr,idx);
            idx++;//不同数字代表不同海报
        }
        cout<<query(1)<<endl;
        memset(a,0,sizeof a);
        alls.clear(),sec.clear();
    }
}

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

Mayor‘s posters (线段树+离散化) 的相关文章

随机推荐

  • 【PHP教程(二)】php登陆验证(附代码)

    1 登陆脚本 2 受保护的网页示例 3 注销脚本 4 注意事项 5 Hash函数字符串转换 6 php登陆脚本 哈希值验证 可以使用 PHP 创建登录脚本 PHP 提供了用于处理用户身份验证和会话的内置函数和功能 这是登录系统的基本组件 这
  • 2023春节祝福系列第一弹(上)(放飞祈福孔明灯,祝福大家身体健康)(附完整源代码及资源免费下载)

    2023春节祝福系列第一弹 上 放飞祈福孔明灯 祝福大家身体健康 附完整源代码及资源免费下载 目录 一 前言 二 一片星光闪烁的旋转星空 1 效果展示 2 相关源代码 3 语法解释 3 1 线性渐变 linear gradient 3 2
  • Java异常知识点总结

    Java异常知识点总结 1 异常处理机制主要回答了三个问题 What Where Why What 异常类型回答了什么被抛出 Where 异常堆栈跟踪回答了在哪抛出 Why 异常信息回答了为什么被抛出 2 Java异常体系 RuntimeE
  • Python的Object基类__repr__方法

    Python的Object基类 repr 方法 Python基类的內建方法 repr 是执行一个官方的 或者正式的 代表一个对象的字符串 也就是说可以将字符串转换成一个Python对象 如果可能的话 最好是有效的表达式字符串 如果不可能的话
  • Visual Studio 2017 如何更改缓存以及组件的路径,以保证VS2017正常启动

    当安装完Visual Studio 2017时 发现安装过程中设置的缓存路径或组件存放路径不合理 但一旦修改 会导致Visual Studio 2017出现项目加载失败等问题 修改方法是通过 regedit命令打开windows注册表 然后
  • 财务系统软件c语言,用vc++6.0编写一个简单的财务应用程序来计算职工所得的实际工资...

    满意答案 xfitijnf 2014 09 30 采纳率 51 等级 12 已帮助 32118人 又写了一个简单的 c语言 另外 我和一楼不是一个人 123456789101112131415161718192021222324252627
  • Redis为服务器设置密码

    以下以Windows版本为例 在 redis windows service conf 文件 设置 requirepass foobared requirepass 123456 masterauth
  • AD常用使用快捷键和技巧

    PCB布线常使用 ctrl m 测量长度 ctrl C 取消显示测量长度 Q 单位切换 shift ctrl r 取消显示标注 shift S 显示层切换 ctrl 右击 高亮显示一条线 ctrl D PCB 2D显示设置 层 透明度 A
  • OpenCV:imwrite函数保存图片

    imwrite函数功能 用于将图像保存到指定的文件 可以为各种格式的图像 函数原型 bool cv imwrite const String filename InputArray img const std vector
  • js实现input的赋值

    input框赋值 如下所示 是一个文本框的html代码 实际开发中 要涉及到将数据库中的数据取出然后放入input框中
  • UML 用例图、顺序图、状态图、类图、包图、协作图、流程图

    面向对象的问题的处理的关键是建模问题 建模可以把在复杂世界的许多重要的细节给抽象出 许多建模工具封装了UML 也就是Unified Modeling Language 这篇课程的目的是展示出UML的精彩之处 UML中有九种建模的图标 即 用
  • vue事件对象、冒泡、阻止默认行为

    事件对象
  • 【满分】【华为OD机试真题2023 JAVA&JS】任务混部

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 任务混部 知识点差分 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 公司创新实验室正在研究如何最小化资源成本 最大化资源利用率 请你设计算法帮他们解决一个任务混
  • sql-labs注入1-10关

    sql labs注入第1 10关 Less 1 输入 id 1登录页面正常 Order by对前面的数据进行排序 这里有三列数据 我们就只能用order by 3 超过3就会报错 order by 4 的结果显示结果超出 爆数据库名 id
  • SpringBoot+MyBatis搭建迷你小程序

    本项目如下 maven的安装目录在哪 setting文件放在哪 仓库在哪 分别为G Program Files x86 apache maven 3 5 4 conf 与G Program Files x86 apache maven 3
  • 【高等代数】行列式的定义和性质

    文章目录 逆序数 逆序数的定义 逆序数的一个重要性质 行列式的定义 行列式的性质 逆序数 逆序数的定义 一个排列中的某两个数字 如果前面的数大于后面的数 那么它们就是一个逆序 一个排列中逆序的总数就称为这个排列的逆序数 逆序数用 j 1
  • JAVA的安装与卸载

    1 java的卸载 1 删除java的安装目录 2 删除系统环境变量里的JAVA HOME和Path里面的bin目录和jre bin目录 3 cmd输入java version 查看是否删除取消 2 java的安装 1 百度搜索jdk1 8
  • 【算法题】螺旋矩阵III (求解n阶蛇形矩阵)

    一 问题的提出 n阶蛇形矩阵的特点是按照图1所示的方式排列元素 n阶蛇形矩阵是指矩阵的大小为n n 其中n为正整数 题目背景 一个 n 行 n 列的螺旋矩阵可由如图1所示的方法生成 观察图片 找出填数规律 填数规则为从 1 开始填到 n n
  • Zinx框架学习 - 构建最基础的Server

    Zinx V0 1 构建最基础的Server Zinx的框架结构 整体思路 客户端发送请求到服务器端 服务端会有一个Goroutine专门处理listenner和监听这个过程 然后有客户端连接过来之后会启动一个客户端处理Goroutine
  • Mayor‘s posters (线段树+离散化)

    题目链接 Mayor s posters 思路 由于看到l r的值最大可达到1e7 这时候如果强行build 那么大概率会出错 看到n的值只有1e4 这时候我们应该想到用离散化去解决这个问题 而且 这里还有一个坑点 假如所给区间为 1 4