河南省多校连萌(七)

昨天打了一场河南多校联盟,打的我开始怀疑人生。学长说这次是信息工程大学出题,信息工程大学?还有这个学校。后来听寝室室友说,这指的是解放军信息工程大学,在郑州。我大河南还有这个学校,真的发现自己是多么的孤罗寡闻。室友说这种大学一般不参与普通大学之间的排名(难怪我不知道有这个大学),但是学校比郑大要好得多。想想郑大是我大河南唯一的一所211工程大学,现在还有一个比它要好的大学,真的后悔以前没有好好的关注些这方面的消息。

好的大学和不好的大学真的不一样,别人出题的水平都和我们不是一个级别的。这些题表面上看都很简单,但是痛苦的是你明明感觉题很简单就是做不出来。

 

这是学长发的题解,不过看了之后还是一脸懵逼(怀疑自己的智商)

点击打开题目链接  河南省多校连萌(七)题解

 

A.等价交换

题⽬目给出⼀一个只含有加法和乘法的等式,让我们来判断等式是否成⽴立。由于没有括号,所以从左到右扫⼀一遍即可,注意题中是作为等式的每个数都

<1e9,但是经过加法和乘法后会爆int,这个我在样例例中提到了了。还有等号两边  都有加号和乘号,处理理时需要注意。

 

 

B.arufuonsusnoufura

本题是给出⼀一个环形字符串串,判断去掉⼏几个字符可以构成回⽂文串串。考虑

⾮非环形的情况下判断最少去掉多少构成回⽂文串串时选⽤用的⽅方法是构造⼀一个反串串,  然后找到最⻓长公共⼦子序列列,这⾥里里字符串串的⻓长度很短,所以可以枚举环形串串拆开的位置,然后取最⼩小值即可。

 

 

C. teddy的回⽂文串串

题意:选出⼀一个⼦子串串,然后在后⾯面填充少于⼦子串串的字符成⼀一个回⽂文串串, 问能组成多少组不不同的回⽂文串串。

1、⾸首先对于⼀一般情况找到⼀一个⼦子串串,然后要求填充的字符要⼩小于⼦子串串,   所以直接以最后⼀一个字符为轴填充回⽂文串串即可,此时不不需要考虑本身已经构成   回⽂文串串或者⼀一部分是回⽂文串串,假如有m个不不同的⼦子串串,那就有m种不不同的回⽂文  串串,对于求不不同⼦子串串的个数,可以套⽤用后缀数组的模板,然后统计n-sa[i]-

height[i]即可。

2、可能有的⼦子串串末尾2位是相同的,这时可以构造出偶数⻓长度的回⽂文串串,同样如果本身已构成⼀一部分回⽂文串串的部分不不需要考虑,因为会和之前统计 的重合,这⾥里里我们就要求出所有不不同的末尾2位相同的⼦子串串,注意这个⼦子串串前

⾯面⼀一定还要有字符,因为填充⻓长度⼤大于0.我的⽅方法是:从第⼆二位开始,统计和   后⼀一个字符相同    的位置,⽤用mark[i]来存从第i位到最后⼀一位满⾜足上述条件的字

 

符个数,之后会⽤用到。然后使⽤用后缀数组中统计到的sa数组和height数组,sa   数组代表排名第i的后缀的起始位置,height数组代表排名第i的后缀和第i+1的后缀最⻓长公共前缀,对于公共的前缀不不予考虑,所以只需考虑sa[i]+height[i]后

⾯面的字符,以此来避免重复⼦子串串,从sa[i]到sa[i]+height[i]后⾯面所有的前缀如果  有末尾两位相同的ans就要+1,所以mark数组就⽤用上了了,ans直接

+mark[sa[i]+height[i]]求值,注意之前的问题末尾2个字符前⾯面⼀一定要有字符,

特判⼀一下。最后ans long long。

 

 

 

D. teddy VS bear

其实这⼀一类问题叫做k倍动态减法,具体可以参考曹钦翔的《从“k倍动态减法游戏”出发探究⼀一类组合游戏问题》。当k=2时有叫做fibonacci博弈。

 

⾸首先考虑k=1的情况,必败态为2的次⽅方数,对必胜态,将数⼆二进制分解,每次取低位的1,对⾯面肯定⽆无法⼀一次将剩下的所有取完。每次取最低位会必胜。   对于k=2的情况,必败态为fibonacci数,⼀一个很重要的性质就是任意整数n都可以分解为不不相邻的fibonacci数相加,不不相邻的2个数之间差距2倍以上,因此可  以分解后每次取最⼩小位。如果不不清楚定理理,可以参考k=1的情况,我们需要构 造⼀一个数列列使得每个整数可以由数列列中若⼲干个数相加并且这些数倍数差距⼤大于

k,我们⽤用a来存这些数,⽤用b来表示前i-1个能构成的最⼤大的数,那么

a[i+1]=b[i]+1;然后再构造b[i+1],由于b[i+1]要⽤用到a[i+1],并且不不相邻,因此  要找到a[j]*2<a[i],b[i+1]=a[i+1]+b[j]。

查询时只需要不不断减去最⼤大的a[i]直到0,最后剩下的就是第⼀一次取的值。

 

E.F.G

 

 

 

H.抽奖活动

答案为最⼤大的两个正数或最⼩小的两个负数相乘,由数据[4e-9,4e9]及输出 不不⼩小于0表明需要⽤用到unsigned long long。

 

ac代码

 

I.勇⼠士与魔王

考虑如果每个分身⾎血量量都⼤大于1,必胜⽅方为了了保证操作总数是不不变的,会

⼀一直合并,保证必败⽅方没有机会对数为1的情况进⾏行行操作。所以操作总数=⾎血量量和+堆数-1

⽽而如果存在⾎血量量为1的情况,分情况讨论。⾎血量量为1的操作总数=⾎血量量和。 将分身⾎血量量为1的分为堆1,⼤大于1的分为堆2。进⾏行行记忆化搜索。

每次搜索有以下⼏几种情况:

1.减堆1

2.减堆2

3.合并堆1中的⼀一个和堆2中的⼀一个

4.合并堆1中的两个

5.合并堆2中的两个

 

posted @ 2017-09-10 20:19  Veritas_des_Liberty  阅读(319)  评论(0编辑  收藏  举报