首页 > 其他分享 >摆渡之心 初赛三 A~F

摆渡之心 初赛三 A~F

时间:2023-09-24 20:13:22浏览次数:53  
标签:之心 f0 特殊 min 攻击 ht 摆渡 初赛 使用

A

求所有长度为 \(n(n\leq10^6)\) 且满足条件的小写字母字符串 \(S\)。

  • 存在至少三个不交的连续子串 \(T = \mathbf{shs}\)

定义 \(f(i,j,k)\) 表示对于长度为 \(i\) 的字符串,满足已经存在 \(k\) 个连续子串,且最后 \(j\) 位与,\(T\) 的前 \(j\) 位相同。

直接 DP 即可,考虑该状态能从何处转移而来,方程见代码。

	#define irep(i,l,r) for(int i = l; i <= r; ++i)
	f[0][0][0] = 1;
	irep(i,1,n){
		f[i][0][1] = f[i-1][0][0] + f[i-1][0][1];
		f[i][0][2] = f[i-1][0][1];
		f[i][0][0] = f[i-1][0][0] * 25 + f[i-1][0][1] * 24 + f[i-1][0][2] * 25;
		
		f[i][1][0] = f[i-1][1][0] * 25 + f[i-1][1][1] * 24 + f[i-1][1][2] * 25 + f[i-1][0][2];
		f[i][1][1] = f[i-1][1][0] + f[i-1][1][1];
		f[i][1][2] = f[i-1][1][1];
		
		f[i][2][0] = f[i-1][2][0] * 25 + f[i-1][2][1] * 24 + f[i-1][2][2] * 25 + f[i-1][1][2];
		f[i][2][1] = f[i-1][2][0] + f[i-1][2][1];
		f[i][2][2] = f[i-1][2][1];
		
		g[i] = f[i-1][2][2] + g[i - 1] * 26;
		irep(j,0,2)irep(k,0,2)f[i][j][k] %= mod;
		g[i] %= mod;
		
	}

B

给一个 \(n\times m\) 的矩形网格黑白染色,定义一个染色方案是好的,当且仅当任意相邻两行的颜色对应恰好相同或对应恰好相反,求所有恰好染黑 \(k\) 个格子的染色方案数\((1\leq n,m\leq10^7)\)

不考虑染色数为 \(k\) 的限制,如果某一个状态是好的,那么把它某一列或者某一行取反一定也是好的,已知全白是一个好的状态,实际上所有合法的状态就是选定某一些行,选定某一些列,把它们取反。设选 \(c_1\) 行,\(c_2\) 列,那么染黑的方格数为 \(c_1(m-c_2)+c_2(n-c_1)=k\),可以枚举 \(c_2\),解得 \(c_1=\dfrac{k-n\cdot c_2}{m-2c_2}\),它应当是在区间 \([0,n]\) 之中的整数。那么这种情况下的方案数为 \(\large\binom{n}{c_1}\binom{m}{c_2}\) ,特殊的,当分母 \(m-2c_2=0\) 时,原式化为 \(mn=2k\),故这种情况需要单独考虑,此时无论 \(c_1\) 为何值,式子都成立;若 \(mn\neq 2k\) ,则都不成立。

值得注意的是,选择行列的方案不是染色方案,因为对于所有选择取反,染色结果不变,答案要乘以 \(0.5\)。

  • \(C_n^m=\binom{n}{m}\) 表示组合数

C

对 \(n\cdot (n-1)^2\cdot(n-2)^3\cdots 1^{n}\) 分解质因数 \(n\leq 10^7\)

首先, 设 \(n!\) 的分解为 \(p_1^{\alpha_1}p_2^{\alpha_2}\cdots p_m^{\alpha_m}\) ,则 \(\alpha_i=\left\lfloor\dfrac{n}{p}\right\rfloor+\left\lfloor\dfrac{n}{p^2}\right\rfloor+\left\lfloor\dfrac{n}{p^3}\right\rfloor+\cdots\),其证明显然,第一项表示 \([1,n]\) 中为 \(p\) 的倍数的数,第二项表示为 \(p^2\) 的倍数的,如果 \(t\) 是恰好是 \(p^r\) 的倍数,那么恰好会做出 \(r\) 次贡献。

于是,对于每一个质数 \(p\),即求 \(\sum\limits_{i=1}^n\alpha_{i}=\sum\limits_{i=1}^{+\infty}\left(\sum\limits_{j=1}^n\left\lfloor\dfrac{j}{p^i}\right\rfloor\right)\) ,括号里的式子可以直接求,实际上时间复杂度为 \(O(n)\),瓶颈在筛质数,因为只有为质数次幂的数才会计算答案。

D

有两条长度为 \(n\) 的项链,每个珠子有一个颜色;有 \(m\) 种魔法,每个魔法可以花费 \(c\),能把一个颜色 \(u\) 变成 \(v\);随机把项链旋转,然后染色,使得珠子的颜色对应相等,求最优策略下花费的期望。\(n\leq10^5,m\leq10^6,u,v\leq400,c\leq100\)

对于颜色变换建图,跑 Floyd,把 \(u,v\) 变成同样颜色的最小代价就是 \(W(u,v)=\min\limits_kdis(u,k) + dis(v,k)\) ,考虑所有的旋转方案,\(E=\frac{1}n\sum\limits_{u=1}^n\sum\limits_{v=1}^n W(u,v)\) ,按值域考虑即可。

E

扫一遍,存每个颜色的上一个的位置,新添加一个颜色,可以求出与上一个的距离。判断与 \(K\) 的关系即可。

F

有 \(n\) 批敌人,每一批有 \(c\) 个血量为 \(h\) 的敌人。你可以选择两种攻击方式,你需要依次打败所有的敌人,求最小用时

  • 普通攻击:花一秒减少一个敌人的一点血量
  • 特殊攻击:花零秒减少一个敌人的 \(k\) 点血量

初始状态可以使用特殊攻击,当使用过特殊攻击后将不能使用,但是如果杀死某个敌人的最后一击是普通攻击,则能够恢复使用特殊攻击的能力。

定义 \(f(i,0/1)\) 为消灭前 \(i\) 批敌人,且消灭之后 能够/不能够 使用特殊攻击的最小时间。

如果 \(h\geq k+1\),杀死一个敌人可以立即恢复特殊攻击:\(f(i,0/1)=\min \{(h-k)\cdot c+f(i-1,0),(h-k)\cdot c+k+f(i-1,1) \}\)

如果 \(h\leq k\),那么如果使用特殊攻击将会一击必杀,需要对 \(c\) 分奇偶讨论:

若 \(c\) 为奇数

考虑 \(f(n,0)\):若开始能够使用特殊攻击,则为使用特殊攻击的方案是 YNYNN,第 \(i\) 个字符为 Y 表示对第 \(i\) 个敌人使用特殊攻击;若不能使用,则方案为 NYNYN

考虑 \(f(n,1)\):若开始能够使用特殊攻击,则为使用特殊攻击的方案是 YNYNY,若不能使用,则方案为 NYNNY

若 \(c\) 为偶数

考虑 \(f(n,0)\):若开始能够使用特殊攻击,则为使用特殊攻击的方案是 YNYN,若不能使用,则方案为 NYNN

考虑 \(f(n,1)\):若开始能够使用特殊攻击,则为使用特殊攻击的方案是 YNNY,若不能使用,则方案为 NYNY

根据以上讨论,可以列出 DP 方程,详见代码:

int main(){
	ll f0 = 0, f1 = 0;
	ll n = read(), k = read();
	irep(i,1,n){
		ll ht = read(), c = read();
		ll g0, g1;
		if(ht > k)g0 = g1 = min(f0 + c * (ht - k), min(f0,f1) + (c - 1) * (ht - k) + ht);
		else{
			int a = c / 2;
			if(c & 1){
				g0 = min(f0,f1) + (a + 1) * ht;
				g1 = min(min(f0,f1) + (a + 1) * ht, f0 + a * ht);
			}else{	
				g1 = min(f0,f1) + a * ht;
				g0 = min(f0 + a * ht, min(f0,f1) + (a + 1) * ht);
			}
		}
		f1 = g1, f0 = g0;
	}
	cout << min(f1,f0);
	return 0;
}

标签:之心,f0,特殊,min,攻击,ht,摆渡,初赛,使用
From: https://www.cnblogs.com/haze1231/p/17726407.html

相关文章

  • csp初赛游记
    Day0(9.15)坐了2场初赛的模拟,觉得应该挺稳得了就去复习复赛了。从最早的S组真题开始做,坐了3年的就去睡觉了。挺稳的指只得80分上下Day1(9.16)虽然不紧张,但任然没睡好4点多就醒了,在床上躺着。到6点就起来了,也不想看书复习就在哪傻坐着。7点出发坐地铁去张江,早上J组基本没啥悬念。......
  • 《2023CSP-S第一轮(初赛)游记》2023.9.16
    菜是原罪从前有个流浪汉,他坐在那池塘旁,在一棵桉树的底下乘凉。他一边遥望一边歌唱,歌声在那池塘边上回荡,快来吧和我一起去流浪。流浪的人啊,流浪的人啊,我们一起走遍海角天涯,他一边遥望一边歌唱,歌声在那池塘边上回荡,快来吧和我一起去流浪。——《WaltzingMatilda》,澳大利亚民......
  • 2023.9.26 CSP-S初赛游记
    2023.9.26CSP-S初赛游记省流:各位的发挥一定很好吧,那就别跟我抢奖励名额了开启流水账模式\(9.15\)嗯,自测一下\(2022\)年的题。好,\(79.5\),稳了,不看了,做题摆烂去了。(一整天一道题都没做)\(9.16\)上午:应该问题不大,考前再看一眼\(Linux\)和十大排序稳定性就行,做题摆烂......
  • 「比赛游记」初赛简记
    「比赛游记」初赛简记J计算机常识两个,一个操作系统一个忘了,比较好。大家都在讨论哈夫曼编码?手算了一下应该选A啊。wkh说选B,那就选B吧,我不会。早上指导xrlong使用DP数数,虽然他似乎没太听但是压中题了,比较厉害。没有栈。又出锅是吧,我丢的30min这一块谁给我补啊?阅......
  • 随缘复习初赛
    常识&参考资料初赛史上最全NOIP初赛知识点【全】CSP初赛通过指南CSP-J/S初赛知识点整理CSP-J/S初赛复习(1)-计算机基本常识、进制与编码!CSP初赛知识点考前整理CSP初赛知识点梳理二进制\(n\)进制转\(10\)进制,第\(i\)位的值乘上其位权\(2^{n-1}\)\(10\)进制转......
  • 摆渡车—线性dp
       #include<bits/stdc++.h>usingnamespacestd;intn,m,a[505],f[510][110],inf;ints[505],t[505];intmain(){ std::ios::sync_with_stdio(false); cin>>n>>m; memset(f,0x3f,sizeoff);inf=f[0][0]; for(inti=1;i<=n;i++) { c......
  • CSP初赛错题集
    初赛错题集洛谷有题NOIP2018T9给定一个含N个不相同数字的数组,在最坏情况下,找出其中最大或最小的数,至少需要N-1次比较操作。则最坏情况下,在该数组中同时找最大与最小的数至少需要(A)次比较操作。(\(\lceil\rceil\)表示向上取整,\(\lfloor\rfloor\)表示向下取整)A.⌈3N/2⌉-2......
  • CSP-S2022初赛易错题解析
    一.2.错误原因:不会解析:real代表实际运行时间,user代表用户态运行时间,sys表示内核态运行时间,故选A 5.错误原因:不会解析:基数排序的思路类似于桶排序,故选A 9.错误原因:不会解析:这个问题可以转化成圆排列问题,公式为A(n-1,n-1),即(n-1)!,要考虑从两个方向看的图,所以要除......
  • 洛谷P8211 [THUPC2022 初赛] 搬砖
    题目链接以下设\(B\)为一个阈值,同时也表示值域分块的块长。先考虑所有\(b\)都不为\(0\)的情况。对于一组询问,我们设一个\(x\)表示:当前已搬完所有\(a\leqx\)的砖。那么每次只可能是以下两种情况之一:有至少一摞砖在当前这个单位时间内被搬完拿\(x\)加上\(d\),之......
  • CSP 2020 第一轮(初赛)模拟解析
    一、十进制数\(114\)的相反数的\(8\)位二进制补码是:A.\(10001110\)$\\\\\$B.\(10001101\) $\\\\\$C.\(01110010\) $\\\\\$D.\(01110011\)点击查看答案根据原码补码反码的有关定义可得:-114的源码为:01110010反码为:10001101......