首页 > 其他分享 >做题记录 2

做题记录 2

时间:2024-11-28 20:54:35浏览次数:5  
标签:记录 max rep 手环 权值 序列 sum

上一个写的太多了,卡爆了。所以再开一个。

P4321 随机漫游

一道综合多种算法的好题。

首先按照图上随机游走的套路,再依据 \(n\) 很小的限制,可以设出 \(dp\) 方程:设 \(f_{s, u}\) 表示当前走过的点集为二进制数 \(s\),当前在 \(u\) 点,再走完所有点的期望步数。那么显然有 \(f_{(1 << n) - 1, u} = 1\)。

然后写一下转移柿子:

\[f_{s, u} \leftarrow \sum_{(u, v) \in E} \dfrac{1}{deg_u} f_{s \bigcup v, v} + 1 \]

然后发现这是一个 \(2 ^ n \times n\) 元的线性方程组。所以可以直接高斯消元。时间复杂度 \(O((2 ^ n \times n) ^ 3)\)。但是显然爆了。

再考虑将转移方程改写一下,分 \(v\) 原本是否属于 \(s\) 进行讨论:

\[f_{s, u} \leftarrow \dfrac{1}{deg_u} (\sum_{(u, v) \in E, v \in s} f_{s, v} + \sum_{(u, v) \in E, v \not \in s} f_{s \bigcup v, v}) + 1 \]

整理得到:

\[\dfrac{1}{deg_u} \sum_{(u, v) \in E, v \in s} f_{s, v} - f_{s, u} = -(\frac{1}{deg_u} \sum_{(u, v) \in E, v \not \in s} f_{s \bigcup v, v} + 1) \]

这样,只需要按照集合 \(s\) 大小倒序枚举,方程组大小自然降为 \(O(n)\)。

时间复杂度 \(O(2 ^ n n ^ 3 + Q)\)。

\(\text{AC code}\)

P3723 [AH2017/HNOI2017] 礼物

首先发现加减相对于两个手环是对称的。因此可以把对一个手环的减法转化成对另一个手环的加法。这样可以假设全是在第一个手环上执行的加减操作。

第一个手环执行了加 \(c\) 的操作,且旋转过之后的序列为 \([x_1, x_2 \cdots x_n]\),第二个手环为 \([y_1, y_2 \cdots y_n]\)。计算差异值并化简,可以得到差异值是:

\(\sum x ^ 2 + \sum y ^ 2 + c ^ 2 n + 2c(\sum x - \sum y) - 2 \sum xy\)

可以发现,这个序列只有最后一项是不定的。

因此将 \(y\) 序列翻转后再复制一倍,与 \(x\) 卷积,答案就是卷积后序列的 \(n + 1 \sim 2n\) 项系数的 \(\max\)。

直接暴力枚举 \(c\),加上前面依托就行了。

\(\text{AC code}\)

P3514 [POI2011] LIZ-Lollipop

回归简单题。

给定权值为 \(1\) 或 \(2\) 的序列,每次询问有没有权值等于 \(k\) 的子区间。

神仙思维题。

假设当前有一个序列权值和为 \(w\)。那么分下面情况讨论:

  • \(a_l = 2\),\([l + 1, r]\) 的权值和为 \(w - 2\)。

  • \(a_r = 2\),\([l, r - 1]\) 的权值和为 \(w - 2\)。

  • \(a_l = a_r = 1\),\([l + 1, r - 1]\) 的权值和为 \(w - 2\)。

综上,总能根据一个权值为 \(w\) 的序列,构造出权值为 \(w - 2\) 的序列。

因此只需要知道序列中,权值为奇数的最大子区间和权值为偶数的最大子区间就可以了。

代码下周再补。

P8060 [POI2003] Sums

同余最短路典题。

CF1527E Partition Game

首先能够想到一个很典的 dp:记 \(f_{i, j}\) 表示前 \(i\) 个元素划分成 \(j\) 段的最小代价。转移 \(O(n)\),时间 \(O(n ^ 2 k)\)。

考虑优化。首先看这个转移柿子:\(f(i, j) = \min \{ f(k, j - 1) + cost(k + 1, i) \}\),这个东西看起来就很凸性。看了看题解确实也是这样的,但是我不会证明。

接下来考虑线段树优化。首先开一个线段树,把 \(cost\) 和 \(dp\) 值加起来放到线段树里。考虑每次转移都是加入一个新元素,并且对前面的 \(dp\) 值没有影响。接下来考虑这个新加入的元素对前面 \(cost\) 值的影响。可以发现,他只对 \(\mathrm{last}_{a_j} \le i\) 的有影响。

所以只需要线段树支持区间加,区间取 \(\min\),单点插入就可以了。

CF1149C Tree Generator™

可以发现,两个点之间的距离,就是这两个点之间括号序列,消掉匹配的括号以后,剩下的没有匹配的括号。

因此问题转化为求最大权值子段,子段权值为消掉合法括号匹配之后的括号数。

这个东西可以线段树维护一下。由于最后括号序列一定形如 \(\texttt{))))...((((}\),可以记一下当前区间剩下的 \(\texttt{), (}\) 的数量分别是多少,以及区间最大权子段。转移的时候分类讨论一下即可。

CF242E XOR on Segment

这道题有许多做法,其中最简单的就是拆位建 \(20\) 棵线段树爆算

不赘述了。依据的是亦或的位独立性。\(O(n \log n \log V)\)。

P4046 快递服务

不妨设 \(f_{i, j, k}\) 表示当前三个司机在 \(i, j, k\) 号公司,而且已经遍历到了 \(\max(i, j, k)\) 号公司的 minimum cost。

转移是平凡的。可以做到 \(O(n ^ 3)\),\(n = 1000\)。由于常数小 1s 完全不虚。

signed main() {
	read(n);
	rep(i, 1, n) rep(j, 1, n) read(d[i][j]);
	a[ ++ m] = 3, a[ ++ m] = 2, a[ ++ m] = 1;
	while (scanf("%lld", &a[ ++ m]) != EOF);
	memset(f, 0x3f, sizeof f); f[1][2][1] = 0;
	rep(i, 3, m) {
		rep(j, 2, i) rep(k, 1, j) f[(i & 1) ^ 1][j][k] = INF;
		rop(j, 2, i) rop(k, 1, j) {
			chkmin(f[(i & 1) ^ 1][j][k], f[i & 1][j][k] + d[a[i]][a[i + 1]]);
			chkmin(f[(i & 1) ^ 1][i][k], f[i & 1][j][k] + d[a[j]][a[i + 1]]);
			chkmin(f[(i & 1) ^ 1][i][j], f[i & 1][j][k] + d[a[k]][a[i + 1]]);
		}
	} rep(i, 1, m) rep(j, 1, m) ans = min(ans, f[m & 1][i][j]);
	printf("%lld\n", ans); return 0;
}

P4158 粉刷匠

发现木板的粉刷相对独立。若求出每个木板粉刷 \(j\) 次获得最大收益 \(w_{i, j}\),则容易进行分组背包。

现在考虑如何求 \(w_{i, j}\)。不妨设 \(f_{i, j}\) 表示粉刷了前 \(i\) 个格子,粉刷了 \(j\) 次获得的最大收益。枚举上一次粉刷的位置,可以得到转移

\[f_{i, j} \leftarrow f_{k, j - 1} + s_0(k\sim i)/s_1(k \sim i) \]

好像应该是 \(k + 1\)。不管了,大概就这样。最后背包合并就行了。\(O(nm ^ 2t + nt^2)\)。

void calc(int n) {
	rep(i, 0, m) rep(j, 0, t) f[i][j] = 0;
	rep(i, 1, m) s1[i] = s1[i - 1] + (g[n][i] == '1');
	rep(i, 1, m) s0[i] = s0[i - 1] + (g[n][i] == '0');
	rep(i, 1, m) rep(j, 1, t) rop(k, 0, i) {
		f[i][j] = max(f[i][j], f[k][j - 1] + s1[i] - s1[k]);
		f[i][j] = max(f[i][j], f[k][j - 1] + s0[i] - s0[k]);
	} rep(i, 0, t) rep(j, 0, m) w[n][i] = max(w[n][i], f[j][i]);
}
signed main() {
	read(n, m, t);
	rep(i, 1, n) scanf("%s", g[i] + 1);
	rep(i, 1, n) calc(i); memset(f, 0, sizeof f);
	rep(i, 1, n) rep(j, 0, t) rep(k, 0, j)
		f[i][j] = max(f[i][j], f[i - 1][j - k] + w[i][k]);
	rep(i, 0, t) ans = max(ans, f[n][i]); printf("%lld\n", ans);
}

不妨让我们一起来考虑优化!可以发现,背包合并的物体体积是 \(O(m)\) 而不是 \(O(t)\) 级别的,因为最多染 \(m\) 次。

复杂度瓶颈变成了预处理。不妨改变一下状态,设 \(f_{i, j, k}\) 表示染了前 \(i\) 个格子,用了 \(j\) 次,最后一个染的是红 / 蓝。这样就可以做到 \(O(nmt)\) 转移。故做到 \(O(nmt)\)。

标签:记录,max,rep,手环,权值,序列,sum
From: https://www.cnblogs.com/Link-Cut-Y/p/18575144

相关文章

  • 2024.11.[~, 28]训练记录
    好,今天是noip2024前最后一次模拟。但是我参加不了noip。还是认真参加了模拟赛。自主复习就写训练记录吧。落下很多天了。今天的题疑似有点难订正了。那就先写今天的。11.28noip模拟今天的考试时间为了全真对标特意推迟了半个小时,写到最后还是有点困了。毕竟平常一点钟睡午......
  • 大数据学习记录,Python基础(2)
    数据类型字符串概述:由若干个字符组成字符序列,称之为字符串特点:字符串一旦被创建就不能被更改定义一个字符串s1="hello"字符串一旦被创建就不能被更改s1="hello"s1="world"#相当于将新的字符串内存中的地址值赋值给了s1,原本的"hello"的内容没有改变print(......
  • 2024.11.20训练记录
    pack设当前手上的钱数为x。二分一段一段跳的复杂度是对的。因为,如果下一段的代价总和sum<\dfrac{x}{2}。那么这一段的下一个数肯定也小于\dfrac{x}{2}。因为是从大到小排。所以还能继续选下一个数,引出矛盾。所以每段的代价总和只能大于\dfrac{x}{2}。那段数就是log级别的。......
  • 11.28 CW 模拟赛 赛时记录
    看题有外校的一起考,那我爆个\(0\)\(\rm{A}\)至少不能是简单题考虑找规律一类的东西,看能不能推出来?\(\rm{B}\)啊?也是需要脑子,多半不会做,应该也是规律题\(\rm{C}\)至少暴力可以打,争取达到高档暴力\(\rm{D}\)能打到这在想吧完了嘛时间分配:\(1\rm{h}+......
  • Synopsys 安装记录
    Synopsys安装记录安装环境概述系统:win11的wslubuntu18.04软件:芯王国提供的Synopsys2018完整的安装教程请参考:搭建属于自己的数字ICEDA环境(三):Centos7安装EDA(vcs2018、verdi2018等)IC工具以及脚本运行第一个工程_sclkeygen-CSDN博客解压遇到的问题压缩包分卷压缩的,在lin......
  • 这些不同类型的 DNS 记录承担着不同的职责,确保域名能够正确地解析到对应的服务、设备
    DNS(域名系统,DomainNameSystem)是用于将域名(如www.example.com)解析为IP地址的系统,它通过一系列的DNS记录来实现这一过程。不同类型的DNS记录对应不同的功能,下面是常见的几种DNS记录类型:1. A记录(AddressRecord)功能:将域名解析为IPv4地址。示例:CopyCodeexample......
  • 如何记录网站来访者的IP地址
    js如何记录来访者ipEdit2•2024年9月23日下午12:49•百科 JS如何记录来访者IP:使用服务器端语言、调用第三方API服务、结合前端和后端技术  在JavaScript中,直接获取来访者的IP地址并不容易,因为JavaScript运行在客户端环境中,而IP地址信息通常在服务器端获取。为......
  • 记录Vue Antd 表格RowSelection刷新列表后缓存问题
    起因 原来的代码//tsx部分<BaseTableoptions={tableData.options}columns={tableData.columns}data={tableData.data}/>constselectKeys=ref<string[]>([])//表格配置consthandleRowSelection={......
  • 11月27日记录(《代码大全》精读笔记)
    《代码大全(第二版)》是SteveMcConnell所著的经典软件开发书籍,其中关于变量和语句的讨论深刻影响了无数程序员的编程实践。以下是对这部分内容的精读体会:变量命名的重要性:变量的命名是编码中最为直观的文档形式。一个好名字能够清晰地传达变量的用途和含义,减少代码的阅读难度。书......
  • remake 前的训练记录2
    unknowndateThe2023ICPCXi'anInvitationalProgrammingContestG按1-n输出排列即可。Tobecontinued.unknowndateCCPC2024哈尔滨unknowndateICPC2023沈阳unknowndateICPC2023南京2024.11.27abc380C扫一遍把连续段起始终止点抠出来,然后模拟。D......