随笔分类 - 题解
摘要:题意 每个数有一个排名,要求维护两种操作: 1. 把$x$和$y$所在的联通块连载一起。 2. 查询$x$所在联通块的$k$小值。 思路 思路显然,并查集维护连通性,动态开点权值线段树合并维护查询。这道题污染了HNOI。 代码 cpp include using namespace std; nam
阅读全文
摘要:题意 有$n$个软件,每个软件都可能有一个依赖软件(换言之,不安装依赖软件就不能安装该软件)。每个软件都有自己的容量和价值,已知总容量,求最大价值。 思路 tarjan+树上背包裸题。 代码 cpp include using namespace std; namespace StandardIO
阅读全文
摘要:题意 有、复杂,自己上网搜 思路 $(x,y)$ 表示从$x$到$y$联通的时间长度。 那么查询操作相当于二维平面上的单点查询。 对于每一个$i$,维护一个最左能到达的$lm$,和最右能到达的$rm$。 那么对于每一个更新操作,相当于对左上角为$(lm,i)$,右下角为$(i,rm)$的矩形做修改。
阅读全文
摘要:题意 有、复杂懒得写,自己上网搜。 思路 观察几组样例之后可以发现有循环,所以求出循环节大小然后区间求并就可以了。
阅读全文
摘要:题意 给$n$个宝石,每个宝石都有重量与价值,求总重量不超过$W$时的最大价值。$W\leq 2^{32}$ 保证每个宝石的重量都可以被表示为$a 2^b$的形式。 思路 分组背包,对$b$分组,在每一组内跑01背包。 每一组之间的转移有$f[i][j]=max(f[i][j],f[i][k]+f[
阅读全文
摘要:题意 FJ要买一个东西,他有$n$种货币,每种货币价值为$v_i$,数量为$c_i$,而商店老板每种货币都有无限个。求交付硬币数与找零硬币数之和的最小值。 题意 对于FJ,此题拆成01背包跑就可以过了;对于老板,跑完全背包。 代码 cpp include using namespace std; n
阅读全文
摘要:题意 有一堆牛,每个牛有重量$w$与质量$t$,现在从中选出若干头,满足: 1. 重量总和不小于给定的$W$。 2. 质量总和除以重量总和最大。 求最大的商。 思路 01分数规划裸题,但是数据太水,可以大力乱搞。 子状态$dp[i][w]$表示选第$i$个之后离达到重量$W$距离为$w$的情况的最大
阅读全文
摘要:题意 给定一颗无根树,可以在上面放置恰好$k$个监听器,与监听器相连的节点被监听,但监听器本身不会被监听。 要求监听所有节点,求方案数模1e9+7。 思路 状态略有毒瘤之处的树上dp。 子状态为$dp[n][k][0/1][0/1]$表示在以$n$为根的子树中选择了$k$个节点,其中是否选择$n$,
阅读全文
摘要:题意 有一个数列,每个元素均有一个完成耗时$t_i$与完成耗费$f_i$,每个元素的耗费等于其完成时刻乘以完成耗费。可以将这些元素分为任意组,每一组的元素完成时刻一样。每一组都会有一个固定的额外时间耗费$s$。数据范围$3 10^5$。 思路 首先推出状态转移方程$dp[i]=min(dp[j]+s
阅读全文
摘要:题意 给定一个数列,求$\sum^n_{i=1}\sum^n_{j=i}(j i+1)min(a_i,...,a_j)max(a_i,...,a_j)$。 思路 采用CDQ分治解决问题。 对于当前的区间$[l,r]$,如果为点直接更新答案。 否则可以分成左右区间$[l,mid],[mid+1,r]$
阅读全文
摘要:题意 凸包模板,给定平面上点集,求包含所有点的凸包周长最小值。 思路 使用$Graham$扫描法解决。 考虑将最左下的点设为原点(事实上任意点均可作为原点),然后其余各点根据斜率排序。 对于每一个节点,我们考虑加入它是否会与已有的边点构成内凹,如果会,那么放弃已有边点。 显然我们可以通过维护一个单调
阅读全文
摘要:题意 有n个关卡,每一关都会在僵尸队列的排头添加一只僵尸,同时排头与家的距离会发生变化。相邻僵尸之间的距离固定为$d$。 对于每一关,可以放置一颗任意攻击力的植物(每颗植物仅作用于当前关卡)。求攻击力总和最小值。 思路 显然$f[i]=max(\frac{sum[i] sum[j 1]}{x[i]+
阅读全文
摘要:题意 给定正整数$n$,求$\sum^n_i\phi(i),\sum^n_i\mu(i)$。 思路 由于数据范围过大,本题采用杜教筛解决,在正确的预处理下,可以达到$O(n^{\frac{2}{3}})$的优越复杂度。 假定对于积性函数$f(i)$,我们需要求$S(n)=\sum^n_if(i)$
阅读全文
摘要:题意 有一张无向无环连通图,点和边均有权值。一条路径的值等于路径上点的最大值加上边之和。 多次询问,两点之间路径最小值。 思路 每个点跑一遍dijkstra,判断是否取点加入点值。 代码
阅读全文
摘要:题意 三维偏序模板题。 思路 第一维排序,第二维CDQ分治,第三维树状数组。 代码 cpp include using namespace std; namespace StandardIO { template inline void read (T &x) { x=0;T f=1;char c=
阅读全文
摘要:题意 给定若干长方形,可以将他们分为任意组,每一组的耗费为最长长乘以最长宽。求最小耗费。 思路 显然存在包含关系的长方形可以看成同一个长方形。 在去重之后,剩下的长方形满足长从小到大,宽从大到小。 那么有$f[i]=min(f[j]+a[i] b[j+1])$ $end$。 代码 没调出来,乱搞了一
阅读全文
摘要:题意 给定一个序列,可以将其分为任意段,每一段的值为$(len+L+\sum C_i)$,其中$L,C$给定。 求最大值。 思路 状态转移方程为$f[i]=min(f[j]+(i j+sum[i] sum[j] L 1)^2)$ 涉及到了平方直接展开比较恶臭,考虑将常数与变量分离,可以得到$f[i]
阅读全文
摘要:题意 给定一个序列,进行$k$次操作,每次操作将会分割序列。 对于每次操作,可以选择将任意一个区间在任意点分割开,得到左侧和乘以右侧和的收益。 求收益最大值。 思路 子状态$f[i][k]$表示前$i$个数割$k$次最大收益。 推出方程为$f[i][k]=max(f[j][k 1]+sum[j] (
阅读全文
摘要:题意 有一个序列,要求将其分为任意部分。对于每一部分,其值为$at^2+bt+c$,其中$t$为这一部分元素总和,$a,b,c$给定。 思路 容易推出状态转移方程为$f[i]=min(f[j]+a (sum[i] sum[j])^2+b (sum[i] sum[j])+c)$ 朴素转移的时间复杂度为
阅读全文
摘要:题意 平面上最开始只包含3个点,然后还会依次出现N个点。每新增一个点,请你求出包含这些点的周长最小的多边形的面积。 思路 采用平衡树维护,每次插入寻找前驱和后继,然后添加节点即可。 注意本题有可能会出现三点共线的情况,可以通过随机指定初始点来解决。 精度略有毒瘤之处。 代码 cpp include
阅读全文

浙公网安备 33010602011771号