2016.12.24【初中部 GDKOI 】模拟赛B组

本文回顾了一次比赛的经历,分析了四道题目的解题思路和技巧,包括使用容斥原理、线段树+哈希等方法,并分享了在算法竞赛中的心得与反思。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

总结:

这次比赛又是平平,几乎每场考试都这样,需要稍微想一下就可以想出的题目都没有做出,哎,智商~

每套比赛都有至少一道题目是在能力范围的,或许还有一道也是有可能自己在考场做出来的,即使后面的题目会越来越难,但也应该尽力去做,至少得尽全力拼搏过,一定要有耐心,沉住气,仔细思考,抓住一道自己认为可做的题目就尽力去做,尽力~

这次比赛30+70+60+30

显然每道题都只拿了部分分,第一题考场已想到大半,但却想的过于复杂,求个数竟然还用容斥原理;

第二题能拿70分就可以了,像这种题目,部分分给的很多,一般都别想太多了,想太多也没用,现在才知道正解是什么线段树+哈希,我线段树都不会打,还做啥~(今天晚上自学一下线段树)

第三题,显然的,部分分容易拿,但是正解也不难啊?为什么就不能多想呢?有时候自己随便的一个念头或许就是正解,有思路就去实现,不要怕错,不错怎么对?

第四题,这道题也比较容易,经别人一点拨就可以做出,但是那“一点拨”主要是因为“别人”已经做对了,所以一点拨自己就领悟了——对自己的智商要有信心~


T1:

·这道题灰常简单,就是找一下规律

·显然对于第i个数,如果满足条件——在排列里只这一个数最大的话,显然它的个数为i^n,但因为与满足i-1条件的个数会重复,个数便为i^n-(i-1)^n(这随便推一下就知道啊,考试根本没认真)

·最后答案因为除以m^n,这里直接除,化简一下快速幂即可。

难度:**


T3:

·60分的做法显然,暴力枚举即可

·容易想到,既然所求序列每两个数的最大公因数都为1,则这个所求序列当中所有的数都无任何相同的质因数,根据此思路,容易想到状压

·为什么状压?因为需判重

·设fi,j表示 满足欲构造的序列中 前i个数 互无最大公因数的 满足要求的 序列,且质因数状态为j的,所有绝对值的差的和

·显然,对于欲构造的每一个数,一定小于2*max{ai}-1

·什么叫做质因数状态为j?准确来说叫状压j,也就是把二进制表示的数转化成十进制储存,这里的质因数状态是指,对于当前前i个数,所拥有的所有质因数(拥有即为1,否则即为0),以类似 二进制的方式 记录每一个数所拥有的的质因数之后 再把这二进制数压成10进制储存的方式 即为状态j

·这里显然是顺推吧,也就是用fi去更新fi+1的值

·枚举第i+1位填什么数,这很容易想到,设填k,显然k满足小于2*max{ai}-1

·那么, 因为不能有重复的质因数,则需要把k分解一下看看它有什么质因数,再通过同样的方式,二进制记录,十进制状压,设分解后的值为x

·则显然x and j=0k=1 才能满足题意,则fi+1,j or x=max{fi,j+|k-a[i+1]|}

·最后分析一下时间复杂度,发现有点悬,59以下的质因数有16个,2^16-1=65535,再乘上个5800=380103000,可以卡过,呵呵~~

·但,是否能优化呢?

·好吧,我觉得好像不能优化了

·那么求出f之后可以再储存两个数组分别存对应的求fi,j时的jk,结果倒推即可


T4:

·这题实际上也比较简单

·下面简要分析一下

·如果暴力枚举,可以水30,那么想想优化

·注意,题目给了2000ms,且m,n<=300,一般来说,出题人都会把m,n的取值范围弄成一些更“整”的数,这里弄成300,显然是有意卡时间

·那么想想O()是否可行呢?

·一个比较美好的想法,枚举矩阵的上下边界,即最上到哪一行,最下到哪一行,然后考虑,是否对于m列能一次扫过并求出所有值对答案的贡献呢?

·注意,因为当前行以确定,每一列也应该是一个以确定的数,即这一列的最小值,其它值不可能对答案有贡献

·即为我们是扫过一行数,那么想想队列?

·显然,对于当前的第j列,它对答案的贡献显然是它最左边能到达的个数乘上最右边能达到的个数(每个个数都加上自己),那么,我们可以考虑两种方法:

·直接暴力,可以水过(我™...)

·可用队列解决,好吧,在看题解时,我承认我一直不知道什么叫做单调队列,直到靠着自己智障的想法做出后问别人之后才知道什么叫做单调队列,然后发现自己打的是单调栈

·解释一下,单调栈嘛,就是单调啊,很单调啊,没什么特殊的,一直递增或递减啊,与单调队列相比不过就是出栈的先后顺序罢了

·设Aj表示在枚举的行的范围内,j列上的最小值

·必然的,如果Aj>Aj-1,则可将Aj加入单调栈,并维护一下它的左边界以及所在位置(显然一开始的左边界为1)

·如果Aj<Aj-1,则显然一直到第一个满足条件Ak<Aj前的前k+1个数对答案的贡献都可算出,贡献=左边界*(j-所在位置)

·并把第j个数的左边界赋值为刚刚对答案做出贡献的所有数的左边界的和,这个性质的正确性显然

·最后,对于栈里如果还有存在的数,则需要再加一遍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值