首页 > 其他分享 >ZROI-21-CSP7连-DAY 7 T2

ZROI-21-CSP7连-DAY 7 T2

时间:2024-10-18 19:48:05浏览次数:7  
标签:int CSP7 T2 Pos 差分 离散 数组 区间 ZROI

题面

挂个 pdf
题面下载

算法

有点像扫描线?

容易想到离散化坐标点, 那么对于离散化之后的坐标 \(x\), 粗略来看, 其能分开区间的个数即为 \(\displaystyle\sum_{i = 1}^{n} \left[{l_i < x < R_i}\right]\)
这个可以用类似于差分的方法解决, 每次对于一个区间 \(\left(l_i, r_i\right)\) , 将其区间整体加 \(1\)
发现到可以用差分, 即将差分数组的 \(l_i + 1\) 位置加 \(1\), \(r_i\) 位置减 \(1\)
于是可以直接在离散化时按照 \(l_i + 1\) 和 \(r_i\) 离散化

然后操作的时候需要注意: 离散化前后对应的区间长度改变
我使用 \(Back\) 数组记录离散化之前的真实坐标

对于每一个离散化之后的点, 都可以计算出其被覆盖的次数(差分数组求前缀和), 关键问题就在于怎么去对应到原序列上
可以发现(以下均为离散化之后的点) \(i, i + 1, i \in [1, \rm{farthest \text{ } position})\) 这两个点能够组成一个区间, 对于区间中的数, 其覆盖次数即为差分数组前缀和 \(i\) 的位置, 这个画画图就能出来
也就是说, 对于离散化之后的每一个位置, 我们依次计算前缀和相等的区间, 然后进行排序并处理

于是就可以写代码了

代码

#include <bits/stdc++.h>
#define int long long
const int MAXN = 1e5 + 20;
const int MAXSIZE = 2e5 + 20;

int T;
int n, m;

struct node
{
    int Left, Right;
} Sec[MAXN];
int Pos[MAXSIZE];
int Pos_cnt = 0;
int Back[MAXSIZE];

void lsh()
{
    std::sort(Pos + 1, Pos + 2 * n + 1);
    Pos_cnt = std::unique(Pos + 1, Pos + 2 * n + 1) - (Pos + 1);

    for (int i = 1; i <= n; i++)
    {
        int Now_Left = std::lower_bound(Pos + 1, Pos + Pos_cnt + 1, Sec[i].Left) - Pos;
        Back[Now_Left] = Sec[i].Left;
        Sec[i].Left = Now_Left;

        int Now_Right = std::lower_bound(Pos + 1, Pos + Pos_cnt + 1, Sec[i].Right) - Pos;
        Back[Now_Right] = Sec[i].Right;
        Sec[i].Right = Now_Right;
    }
}

int Dif[MAXSIZE]; // 差分数组

struct operation
{
    int Val; // 覆盖次数
    int Len; // 对应原序列上的长度
} Cut[MAXSIZE];
bool cmp(operation a, operation b) { return a.Val > b.Val; }

int solve()
{
    /*离散化后, 对差分数组进行计算*/
    memset(Dif, 0, sizeof(Dif));
    int MaxPos = 0, Ans = 0;
    for (int i = 1; i <= n; i++)
    {
        Dif[Sec[i].Right]--;
        Dif[Sec[i].Left]++;
        MaxPos = std::max(std::max(MaxPos, Sec[i].Right), Sec[i].Left);
    }

    /*覆盖次数计算*/
    for (int i = 1; i <= MaxPos; i++)
    {
        Cut[i].Val = Cut[i - 1].Val + Dif[i];
        if(i != 1)
        {
            Cut[i].Len = Back[i] - Back[i - 1];
        }
    }
    std::sort(Cut + 1, Cut + MaxPos + 1, cmp);


    for (int i = 1; i <= MaxPos; i++)
    {
        int Cut_Num = std::min(m, Cut[i].Len);
        m -= Cut_Num;
        Ans += Cut_Num * Cut[i].Val;
    }

    return Ans;
}

signed main()
{

    scanf("%lld", &T);
    for (int Case = 1; Case <= T; Case++)
    {
        scanf("%lld %lld", &n, &m);
        Pos_cnt = 0;

        for (int i = 1; i <= n; i++)
        {
            /*这里的 Sec 可以理解成对差分数组操作的区间*/
            scanf("%lld %lld", &Sec[i].Left, &Sec[i].Right);
            Pos[++Pos_cnt] = ++Sec[i].Left;
            Pos[++Pos_cnt] = Sec[i].Right;
        }

        lsh();

        printf("case #%lld: %lld\n", Case, solve() + n);
    }

    return 0;
}

/*
2
3 1
1 3
2 4
1 4
3 3
1 3
2 4
1 4

Case #1: 5
Case #2: 7
*/

总结

一般要离散化的题, 如果不好处理, 可以考虑:
对于不离散化的状态, 需要哪些信息?
然后将这些信息离散化即可解决问题

标签:int,CSP7,T2,Pos,差分,离散,数组,区间,ZROI
From: https://www.cnblogs.com/YzaCsp/p/18474573

相关文章

  • 题解:GZOI2024 D2T2 乒乓球
    考场上切了,但是比较神奇的题,应该是蓝/紫。Discription乒乓球\(\text{}\)时间限制:\(\bold{3}\)秒众所周知,一场乒乓球比赛共有两个玩家\(A\)和\(B\)参与,其中一场比赛由多局比赛组成,而每局比赛中又由多盘比赛组成。每盘比赛\(A\)或\(B\)只有一名选手获胜。当其中一名......
  • Storefront与NetScaler的集成配置 - part2
    Storefront与NetScaler的集成配置-part2前文介绍了Storefront与NetScaler配置中的StoreFront方面的配置,本章将介绍NetScaler部分的配置。1.从download.citrix.com官方网站下载最新的NetScalerGateway的。对于StoreFront来说,NetSclaer最好使用10.0e和10.1的版本(9.2不支持)。本......
  • 利用LangGraph和Waii实现你的chat2db!
    0前言在数据分析领域快速发展的今天,通过自然语言与数据交互的能力变得越来越有价值。对话式分析旨在使复杂数据结构对没有专业技能的用户更易于访问。LangGraph是个框架,用于构建使用语言模型的状态化、多代理应用程序。Waii提供文本到SQL和文本到图表的功能,使用户能够通过......
  • 捷途山海 T2:非凡之旅,一路璀璨
    当你踏上捷途山海T2的征程,一场非凡的冒险就此开启。这款车以其独特的魅力和卓越的性能,带你穿越山川河流,探索未知的世界。捷途山海T2的外观设计充满力量感,“方盒子”造型硬朗大气,线条简洁流畅。车身的每一处细节都经过精心雕琢,彰显着品质与个性。动力方面,捷途山海T2搭......
  • jsp电影评分网站系统t269d--(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、课题名称电影评分网站系统的设计与开发二、研究目的与意义随着互联网和社交媒体的兴起,电影评分网站已成为影迷们分享观影体验、交流观点的重......
  • 代码随想录算法训练营第42天 | 第九章动态规划 part2
    文章目录第十章单调栈part0242.接雨水示例数组:过程解释表格:过程解析:双指针法84.柱状图中最大的矩形双指针法单调栈法第十章单调栈part0242.接雨水接雨水这道题目是面试中特别高频的一道题,也是单调栈应用的题目,大家好好做做。建议是掌握双指针和单调栈,因......
  • 「模拟赛」CSP-S 模拟 11(T2 超详细)
    比赛链接A.玩水(water)签到。发现如果要找两条路径的话,能找到的充要条件是存在一个点的上方和左方的字母相同。(即使两条走过的点截然不同的路径也符合,这时终点会成为这个点)。即存在一个位置\((i,j)\)使得\(s_{i-1,j}=s_{i,j-1}\),我们称位置\((i,j)\)是好位置。扩展到三......
  • FIT2107 - Software Quality and Testing
    FIT2107-SoftwareQualityandTestingASSIGNMENT2[40%]WhiteboxtestingandcodeanalysisOverviewForthisassignment,yourtaskistodesignanddocumentappropriatetestsforasoftwaresystemusingwhiteboxtechniques,buildaCI/CDpipelinetor......
  • 在qemu添加基于ast2600的设备
    公司的设备基于aspeed的ast2600.和ast2600-evt还是有不小差距,需要为了多模拟一些数据,需要添加新machine,修改部分设备.修改文件hw/arm/aspeed.c1.添加新的machinepf12, 基于ast2600-evb,提供一个classinit函数staticconstTypeInfoaspeed_machine_types[]......
  • SpringBoot2.x 版本集成elasticsearch 8.x
    之前使用的elasticsearch7.14.2,Springboot版本是2.4.13(这个版本坑比较多,用的人也比较少,找问题真的很痛苦)。 es中间件升级到8.13.3之后,之前的代码在使用保存和编辑之后,es数据里面是都操作成功,但是代码接口却会报错。atjava.util.Objects.requireNonNull(Objects.jav......