首页 > 其他分享 >又是做题笔记

又是做题笔记

时间:2025-01-16 14:43:58浏览次数:1  
标签:md 颜色 int sum 笔记 times 做题 calc

说在前面

都是一些 OI Bingo 上的题,可能还会有部分 ABC 的题。

P5929 [POI1999] 地图

题目大意

将一个长度为 \(N\) 的序列染成 \(M\) 种颜色。

对于一个颜色 \(k\),要求染 \(k\) 颜色的点权与 \(A(k)\) 的差的绝对值尽量地小。

其中 \(A(k)\) 定义如下:

  • 在染颜色 \(k\) 的点中至少有一半的点的权值不大于 \(A(k)\)。
  • 在染颜色 \(k\) 的点中至少有一半的点的权值不小于 \(A(k)\)。

求最小误差。

解题思路

首先看到这个 \(A(k)\),这个是什么?

考虑直接将 \(a\) 升序排序,令染颜色 \(k\) 的最小的点下标为 \(l\),最大的点下标为 \(r\)。

那么 \(a_{\frac {l+r}{2}}\) 就是 \(A(k)\)。

考虑 dp,设 \(f_{i,j}\) 表示前 \(i\) 个数中用 \(j\) 种颜色染色的最小误差。

记 \(l\) 与 \(r\) 之间的误差为 \(calc(l,r)\),就可以得到状态转移:

\(f_{i,j} = \min _{k=1}^{i} f_{k-1,j-1} + calc(k,i)\)。

如何在 \(O(1)\) 内求出 \(calc(l,r)\)?

令 \(md = \frac {l+r}{2}\)。

\(calc(l,r) = \sum _{i=md+1}^{r} a_i-a_{md} + \sum _{i=l}^{md-1} a_{md}-a_i\)。

将 \(a_{md}\) 全部提取出来,就可以得到:

\(calc(l,r) = \sum _{i=md+1}^{r} a_i -(r-md) \times a_{md} +(md-l) \times a_{md} - \sum _{i=l}^{md-1} a_i\)。

注意到 \(\sum _{i=md+1}^{r} a_i\) 和 \(\sum _{i=l}^{md-1} a_i\) 都可以用前缀和解决,那么这道题就做完了,最终答案为 \(f_{n,m}\)。

程序时间复杂度 \(O(N^2 \times M)\)。

计算 \(calc\) 部分:

int calc(int l,int r){
    int md=(l+r)>>1;
    int sum1=sum[r]-sum[md];
    int sum2=sum[md-1]-sum[l-1];
    int m1=a[md]*(r-md),m2=a[md]*(md-l);
    return sum1-m1+m2-sum2;
}

状态转移部分:

for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
        for(int k=1;k<=i;k++){
            f[i][j]=min(f[i][j],f[k-1][j-1]+calc(k,i));
        }

标签:md,颜色,int,sum,笔记,times,做题,calc
From: https://www.cnblogs.com/Sunbutstfan1106/p/18674873

相关文章

  • (未完工)「学习笔记」二维数点问题
    0.0前言看了一个晚上,加上同桌的讲解,大致了解了二维数点问题的基本思路。0.1前置知识可持久化线段树树状数组1.0概述二维数点问题的一般形式是形如“给定平面上\(n\)个点,每次询问给定一个矩形,求该位于矩形内的点的个数”一类问题,模板题为P2163[SHOI2007]园丁的......
  • Windows系统下NoteFlow的下载:提供直观、易用的界面,使用户能够轻松创建和连接笔记节点
    NoteFlow(适用于python3.9及以上):功能:节点笔记软件,有助于更好地组织和管理笔记内容。特点:提供直观、易用的界面,使用户能够轻松创建和连接笔记节点。一.从github上获取创作者的代码跳伞到github下载文件压缩包二.Windows只按照pip就行使用pip安装(适用于所有平台)打开命令行......
  • 关于2024秋季学期期末笔记系列
    碎碎念该系列笔记既不够详细,也不够精简,仅作为我期末挣扎的一个存档,不建议各位花时间阅读传送门排序按期末考试先后顺序人工智能导论复变函数光学概率论与数理统计理论力学......
  • 《构建之法》读书笔记
    《构建之法》读书笔记:探索成长与实践的智慧阅读《构建之法》,是一次对软件开发领域深度探索的旅程,更是一场对自我认知与工作方法的革新。这本书为我打开了一扇洞察高效工作与个人成长的大门,书中诸多理念让我深感共鸣,并在实际生活与工作中不断思索、践行。书中提及的“个人开发流......
  • 《CPython Internals》阅读笔记:p152-p176
    《CPythonInternals》学习第10天,p152-p176总结,总计25页。一、技术总结1.addinganitemtoalistmy_list=[]my_list.append(obj)上面的代码涉及两个指令:LOAD_FAST,LIST_APPEND。整章看下来这有这点算是可以记的了,其它的只感觉作者在零零碎碎的罗列内容。二、英语......
  • Golang学习笔记_24——泛型
    Golang学习笔记_21——ReaderGolang学习笔记_22——Reader示例Golang学习笔记_23——error补充文章目录泛型1.泛型中的类型参数1.1类型参数声明1.2类型参数的约束1.3类型参数的实例化2.泛型函数3.泛型类型4.泛型接口源码泛型Go语言从1.18版本开始引入......
  • JavaWeb课后笔记及体会分享(每日一更)
           从今天开始学习JavaWeb,在接下来的时间里我将学习JavaSE,MySQL,Web前端,JavaEE,SSM三大框架,SpainBoot,SpringCloud,以及一些常见面试题的练习。1.IDEA常用快捷键  Shift两次:包含各种文件、方法的搜索Ctrl+Shift+F:根据输入内容查找整个项目或指定目录内文件......
  • 后缀自动机 (SAM) 学习笔记
    \(\text{后缀自动机(SAM)学习笔记}\)一、定义字符串\(s\)的SAM是一个接受\(s\)的所有后缀的最小DFA(确定性有限自动机或确定性有限状态自动机),也就是说:SAM是一张有向无环图。它的结点是图中的状态,边是状态之间的转移。SAM有源点\(t_0\),且其它各结点均可从\(t_0......
  • THREE.js学习笔记6——Geometries
    这一小节学习THREE.js中的物理模型。什么是geometry?(英文解释,翻译为中文就看不懂了,直接看英语吧)Composedofvertices(pointcoordinatesin3Dspaces)andfaces(trianglesthatjointhoseverticestocreateasurface)Canbeusedformeshesbutalsoforparticles......
  • 线段树学习笔记
    什么是线段树线段树是一种基于分治思想的二叉树结构,用于在区间上进行信息统计,比树状数组更为通用、直观,支持单点修改、区间修改、区间查询。线段树维护的数据具有可并性,比如区间和、区间积、区间最值等等。模板建树voidbuild(intl,intr,intp){ tre[p].l=l;tre[p].r=r;......