牛客寒假基础算法训练营2(CEHIM)

官解:editoral

C

构造

基于D题的结论,设钦定子串的最左侧字符为A,最右侧字符为B:只要该子串左侧含有A,或者最右侧字符含有B,那么该子串便合法,只需要找到最长的子串即可。

还可以进一步发现:这个最长子串一定是原字符串的某个前缀或者后缀。否则,一定可以通过向某个方向延长而使解更优。

由于只需要构造一个合法串,因此钦定该子串是原字符串的前缀即可。

由于只有26个字符可供使用,可以guess一下:nm一定不会超过26。否则由鸽巢原理,在除了钦定子串外的其他字符中,必然含有相同的字符,子串便可延长到这对相同字符的位置并使解更优。

那么构造的思路也就出来了:令str[n]==str[m],并且str[mn1]中不含有相同字符即可,这样保证了构造的字符串长为n,且子串最长为m(前缀)。具体构造方式可直接按照字符的字典序循环构造即可。具体见代码。

code

E

思维 + ST表

对于任意询问区间[l,r],推倒 al, 考虑使得 ai 倒下(l+1<=i<=r),需要操作的最少次数:

max(0,aij=li1aj)

最终要使得 ar 倒下,则r前面的每一张牌都必须要倒下,即求上式的最大值:

maxi=l+1r(0,aij=li1aj)

则问题转化为了维护区间最大值,ST表或者线段树都可以做。具体地,可以维护a[i]pre[i1]的区间最大值mx(1<=i<=n),求得结果再加上pre[l1]即为[l,r]上的答案。具体细节见代码。

code

H

思维 + 平面几何

三点不共线时可以共圆,则三点共线时,可以看做共一个无限大的圆。因此三点越接近于共线,圆越大。

因此最优情况为:其中两个点在一条边上,第三个点在另一条边上,并且该点与两点所在边尽可能接近。

剩下的就是正弦定理:尽可能让斜边更长,同时斜边所对的钝角更大,这样外接圆的半径就更长。具体细节见官解。

code

I

典题,待补

code

M

组合数学计数

首先要明确,对于任意1<=i<=n,所有mod3剩余类对应列上的数字必须相同。即第1,4,7...列上的数字必须相同,第2,5,8...列上的数字必须相同,第3,6,9...列上的数字必须相同。证明略。

则最后得到 1,2,3 列上的三列数字,其中第1列对应1,4,7...列上所有数字的交集。

无解情况:显然每一列数字种类数不能超过3,并且每个3x3的九宫格上不能出现相同的数字。

剩下未知的数字可以做自由分配,可直接用组合数来计算(式子见官解)。这样就将每一列的数字种类分配好了,最后对每一列的未知位置全排列计算方案数即可。具体细节见官解。

code

posted @   jxs123  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示
主题色彩