慢慢张开你的眼睛|

两只风小鱼

园龄:2年10个月粉丝:3关注:3

10.5总结(完成)

写在前面的话:暴力yyds!

T1

期盼:100 实际:100

方法:暴力模拟

题如其名,属实是签到题了。直接暴力,因为题目说拿走两个相同的数x后会放入数x+1,所以我一下子想到了二进制,把ai个i当成在第i位上有ai个1。把问题转化一下,我们需要求的实际上是可以进位多少次。直接对每个ai进行累加,把进位的值加入后一位。需要注意的是n次操作后不一定进位完,还要继续算。时间复杂度O(n)

考场上这种题属于必拿分,做完之后要检查,一定不能失分。

T2

期盼:100 实际:100

方法:线段树单点修改+区间查询+一点点二分思想

考场上我一开始是打的暴力,打完之后大样例只跑了0.3s,就估算了一下时间复杂度发现应该能过,总之真的过了还是比较意外的。

看到这道题的第一眼,我就想到了昨天我幸幸苦苦打的线段树二分。而昨天为了正确的打出线段树二分看了很多资料,因此发现线段树二分太有用了,甚至可以用无序数组查找+单点修改。于是我在打线段树时加入了一点二分的思想来优化,就成功的过了。

本题方法有很多分块/线段树都可以过,但思想都是一样的,个人认为线段树更优,因为分块要用stl,而stl众所周知跑的很慢。对于操作1,直接线段树单点修改;而对于操作2就有些难度了,我们维护线段树子区间的最大值,对于最大值小于要取余的数k的子树直接跳过,所以我们只对单点值大于k的数取余;对于操作3,我们直接区间维护最大值就好了。

方法:线段树单点修改+区间查询

image

关于复杂度:对于一个数a我们最多取余loga次,这个数就会变为1或0。所以时间复杂度为O(nlognloga)

T3

期盼:10 实际:10

一道数学题,O(n)预处理+O(1)的输出.

方法:基于错排公式的分类讨论,累计错排总共产生多少贡献(论分类讨论的重要性)

谢邀,希望以后出题人少点数学,多点良心。遇上数学题我基本就只能拿暴力分,而像今天这种卡的比较严的,推出公式100分是没问题的,但我基本上推不出公式,只有暴力的10分,分差还是比较大。不过说实话就算我考场上记得错排公式,我也无法分类讨论后得到正确的公式。

题目明确的告诉我们这道题和错排有关,而错排的公式为D(n)=(n1)(D(n1)+D(n2)),特别的D1=0,D2=1

我们分三种情况来讨论:

  1. i,j,aiaj互不相同,因为交换一定可以产生贡献。总共:dn22n(n1)2
  2. ai=iaj=j显然交换后可以产生贡献。总共:dn2n(n1)2
  3. ai=jaj!=i这种情况要么直接是逆序对;要么如视频里讲的那样,一通交换形成逆序对(ai=aj,aj=i),因为涉及三个数,总贡献为:n(n1)(n2)3dn121n2

把以上三种情况加起来的总贡献,即为答案。(注意:当n为2时需要特判)

T4

期盼:35 实际:45

方法:bitset

我问同学:怎么判断一道题要不要用bitset
答:我不知道。
所以我也不知道。

说吧,出题人你还有没有良心。

一道诈骗题,要不是不会写我就用字符串黑科技,成功被出题人给骗了。考场上直接打的暴力程序,总结下来几个优点:多、快、好写,时间复杂度O(n2)~O(n3),直接爆掉,目标就是拿部分分。

万万没想到要用bitset。先预处理把所有的点存入bitset,如果这个点出现了,就把bitset[s[i]]的第i位赋值为1。
对于修改操作直接O(1)暴力修改;对于查询操作,我们把字符串t的第i位的bitset>>i与存答案的res进行and操作,最终res中区间[l,r]中1的个数,即为答案。

posted @   两只风小鱼  阅读(25)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起