首页 > 其他分享 >ZJOI2010 基站选址 题解

ZJOI2010 基站选址 题解

时间:2025-01-21 21:44:51浏览次数:1  
标签:题解 ZJOI2010 枚举 cost 村庄 operatorname sim 基站

ZJOI2010 基站选址 题解

题目链接

dp + 线段树优化。

暴力 dp

  • 状态设计:自然想到设 \(f(i, j)\) 表示只考虑前 \(i\) 个村庄,在前 \(i\) 个村庄中建 \(j\) 个基站,并且在第 \(i\) 个存在建立基站时,最小的费用。

  • 转移:转移时,枚举上一个建基站的村庄 \(p\)(这同时告诉我们,\(j = 1\) 时要先初始化,否则无法找到上一个建了基站的村庄):

    \[f(i, j) = c_i + \min_{1 \le p < i} \{f(p, j - 1) + \operatorname{cost}(p, i)\} \]

    其中 \(\operatorname{cost}(p, i)\) 表示在 \(p\) 和 \(i\) 建立基站,而两者之间不建基站的情况下,第 \(p + 1 \sim i - 1\) 个村庄的费用。计算时,要考虑这些村庄是否被基站覆盖,如果被覆盖,则不产生费用,否则第 \(x\) 个村庄产生 \(W_x\) 的费用。

    特别地,当 \(i < j\) 时,\(f(i, j) = +\infty\),表示无法在前 \(i\) 个村庄中建多于 \(i\) 个基站。

  • 初始化:\(f(i, 1)\) 表示只在第 \(i\) 个村庄建基站时,前 \(i\) 个基站的费用。

  • 答案统计:我们不知道建几个基站最优,所以对 \(0 \sim k\) 中的所有建基站的数量,我们都拿它更新答案。需要注意,在状态设计中,\(f(i, j)\) 表示只考虑前 \(i\) 个村庄时的答案,这就少考虑了第 \(i + 1 \sim n\) 个村庄的花费。为此有两种解决方法:

    1. 枚举最后一个村庄的位置 \(i\),统计答案时加上第 \(i + 1 \sim n\) 个村庄的花费。
    2. 假设有一个虚拟的村庄,编号为 \(n + 1\),两个费用都为 \(0\),距离为 \(+\infty\)。dp 时,转移到 \(n + 1\),这样 \(f(n + 1, k + 1)\) 就表示建 \(k\) 个村庄时的总答案。显然这种方法比较简单,这也是 dp 的常用手段:新建一个虚拟的元素,以便统计答案。

转移时,枚举 \(p\),同时维护 \(\operatorname{cost}(p, i)\),这样就做到了 \(O(n^2)\) 的时间复杂度。如何动态维护 \(\operatorname{cost}(p, i)\)?不妨假设 \(p\) 从 \(i - 1\) 向左移动,显然一开始没有村庄需要补偿,而随着 \(p\) 向左移动,一些村庄无法被 \(p\) 覆盖,此时就要加上它的贡献。我们可以对每一个村庄 \(x\),记录它是对于哪些村庄来说,最左边的能覆盖它们的村庄。当 \(p\) 从 \(x\) 移动到 \(x - 1\) 时,就加上这些村庄的补偿费用。

优化

首先,直觉告诉我们,先枚举 \(i\) 再枚举 \(j\) 是没有前途的,因此我们反着来。

考虑用数据结构优化转移时找最小值的过程。一般来说,我们希望把和转移点 \(p\) 相关的值分离出来,也就是把转移方程表示成 \(f(i, j) = g(i) + \min_{1 \le p < i} f(p)\) 的形式。

这里的要点在于把 \(\operatorname{cost}(p, i)\) 表示为只和 \(p\) 有关的量。我自己做这道题时,一直在尝试把这个式子拆开,目的是把 \(p\) 和 \(i\) 分离。这种做法有时是可行的,一段区间的和可以表示成两个前缀和相减。但这道题中的 \(\operatorname{cost}\) 是拆不开的。这里是另一个经典套路:考虑扫描线的思想,把 \(i\) 看作常量。每次 \(i\) 移动时,就更新所有 \(\operatorname{cost}\) 有变化的区间。

具体而言,把 \(f(p, j - 1) + \operatorname{cost}(p, i)\) 看作第 \(p\) 个位置的权值。当 \(i\) 移动到 \(i + 1\) 时,有一部分村庄无法再被 \(i\) 覆盖。如果它同时也不能被 \(p\) 覆盖,那么 \(p\) 的权值就要加上它的补偿费用 \(w\)。

对每个村庄 \(x\),定义 \(l_x\) 和 \(r_x\) 分别表示最左边和最右边的能覆盖 \(x\) 的村庄。这显然容易用二分求出。对每个 \(i\),记录有哪些村庄 \(x\) 使得 \(r_x = i\),设这些村庄构成的集合为 \(S_i\)。\(i\) 移动到 \(i + 1\) 时,对 \(S_i\) 中的所有村庄 \(x\),使 \(1 \sim l_x - 1\) 的权值加上 \(w_x\),表示这个范围内的村庄无法覆盖 \(x\)。转移时,取 \(1 \sim i - 1\) 的最小权值加上 \(c_i\) 即可。用线段树维护区间加和区间最小值,时间复杂度 \(O(kn\log n)\)。

标签:题解,ZJOI2010,枚举,cost,村庄,operatorname,sim,基站
From: https://www.cnblogs.com/dengstar/p/18684481

相关文章

  • P1048 [NOIP2005 普及组] 采药 题解
    原题链接题目大意:采药,每种药只有一株,每株有它的价值和采它所需的时间,现时间有限,请你输出在有限时间内能获得的价值最大是多少。分析:1.这是一个典型的01背包问题(DP)01背包问题的典型特征:有一个限定容量的背包(对应本题中的时间),有物品(每种只有一个)(对应本题中的药株),物品有......
  • 洛谷P1002 [NOIP2002 普及组] 过河卒 题解
    原题链接题目大意:棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:向下或向右。同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。棋盘用坐标表示,AA点(0,0)、BB点(n,m),同样马的位置坐标是需要给出的。现在要求你计算出......
  • 2025牛客寒假算法基础集训营1 ptlks的题解
    A.茕茕孑立之影题意:给定序列,找出一个数x,满足x和数组中任意一个元素都互不为倍数关系思路x范围为1e18以内,序列元素范围为1e9以内,选大于1e9的质数即可,特判序列中有1的情况。代码点击查看代码voidsolve(){ intn; cin>>n; intf=1; for(inti=1;i<=n;i++){ cin>>a[......
  • 题解:洛谷 P4879 ycz的妹子
    题目https://www.luogu.com.cn/problem/P4879感觉还比较简单的线段树。首先我们先建立一棵线段树(范围:)。voidbuild(intk,intl,intr){ tr[k]={l,r}; if(l==r){ Tree[k]=a[l],c[k]=(l<=n); return; } intmid=(l+r)>>1ll; build(k<<1ll,l,mid); build((k<<1ll)|1l......
  • 题解:洛谷 P1351 [NOIP2014 提高组] 联合权值
    题目https://www.luogu.com.cn/problem/P1351我们可以发现,若点对  的距离为 ,则它们一定会经过一个中转点,因此我们考虑枚举中转点 ,然后枚举与  有直接边连接的两个点,按照题意统计答案即可。#include<bits/stdc++.h>usingnamespacestd;#pragmaG++optimisze(3,"Ofas......
  • 【题解】Luogu P4340 [SHOI2016] 随机序列
    简单手摸后发现,答案就是这么一个式子:\[(3^{n-1}-3^{n-2})a_1+(3^{n-2}-3^{n-3})a_1a_2+\dots+(3^1-3^0)a_1a_2\dotsa_{n-1}+a_1a_2\dotsa_n\]啊当然证明也是好证的,对于\(a_1\)这一项,它后面放+或-都会对系数加一,而放*不会影响系数,因此系数就是总数的三分之二。其它前缀......
  • 题解:P3823 [NOI2017] 蚯蚓排队
    题目链接https://www.luogu.com.cn/problem/P3823分析先解决队伍的合并与分离问题。使用链表结构,分别维护每只蚯蚓的前驱和后继即可。然后考虑如何统计答案。可以对每只蚯蚓的“向后\(k\)数字串”使用字符串哈希的方式获得哈希值,再用一个哈希表存储每个哈希值出现的次数。对......
  • 2024 (ICPC) Jiangxi Provincial Contest I 题 Neuvillette Circling题解
    简单思路一个圆套中了几个点,如果不断缩小这个圆,那么最终的结果有两种有两个点卡住了这个圆,且这两点一定是直径有三个或者三个以上的点卡住了这个圆,圆心在这三个点围成的三角形的外接圆圆心。因此我们枚举两点作为直径,或者枚举三个点作为圆的内接三角形,求这个三角形的外接圆......
  • 2024 (ICPC) Jiangxi Provincial Contest L 题 Campus 题解
    简单思路首先对于所有的出口求一遍最短路,由于出口只会打开并关闭一次,所以大门的开启状态是相当有限的(最多大概30种),我们对于每一种状态直接暴力求答案最后输出即可。复杂度大概\(O(knlogn)\)参考代码#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;type......
  • Codeforces Round 998 (Div. 3) 部分题解
    写题解的时候这场在评测,就不放代码了。E.GraphComposition题意给两个无向简单图,对图\(1\)添加若干条边或删除若干条边,使得两图的连通性一致,最少需要变更多少条边。题解求出图\(2\)的连通性,考虑图\(1\)的所有边,若违背了图\(2\)联通性的要删除(图\(2\)不联通但图\(......