AtCoder Regular Contest 091&092

091E(构造)

题意:

  给出n,a,b。你需要构造出一个长度为n的n的排列,其中最长上升子序列的长度为a,最长下降子序列的长度为b。

  n,a,,b<=3e5

分析:

  

  我们可以构造出这样的数列,容易发现,a和b能表示出的最大的n是ab,能表示出的最小的n是a+b-1,所以只有a+b-1<=n<=ab的才是合法的。

091F(博弈论)

题意:

  有n堆石子,每堆石子数量是ai,有一个属性ki,一个人取第i堆石子,可以取[1,floor(ai/ki)]个石子。

  Alice和Bob轮流操作,不能操作的人输,问是否先手必胜。

  n<=200;ai,ki<=1e9

分析:

  首先我们可以分析一堆石子,然后把每堆石子的sg异或起来就行了,主要是如何求sg函数

  可以找到关于sg函数的规律:

  

  然后就是求解sg函数的值了,如果直接按照这个公式去迭代那么会TLE

   我们可以去枚举[n/k]的值,将n/k相同的一起减掉,我们现在来分析复杂度

  n/k的值是递减的,所以这部分的复杂度是O(n/k)

  然后因为可以近似看成n=n-n/k-1,所以n=(k-1/k)n

  所以每一步n都缩小了1/k

  因为lim((k-1)/k)^k=1/e,所以可以当作是每k步n的值变成原来的log倍

  所以n缩小的时间复杂度是O(klogn)

  所以总的复杂度应该是这两部分时间复杂度的最小值,所以是

092D(计数)

题意:

  有两个长度为n的数组a[1..n],b[1..n],对于每对(i,j),求a[i]+b[j],把n^2个结果异或起来,求最后的异或的结果。

  n<=200000,ai,bi<=2^28

分析:

  考虑对结果的每一位独立考虑,考虑结果的第k位是0还是1

  对于一个k,关键就是要求有多少个(i,j)满足a[i]+b[j]的第k位是1,如果是奇数个那么答案的第k位就是1否则就是0

  检测第k位的最常用技巧是&(1<<k),但&没有分配律所以不行,但我们还有另一个办法,那就是取模

  设T=2^k,我们考虑(ai+bj)%2T,如果这个数在[T,2T)之间,那么ai+bj的第k位就是1,那么我们如何去统计呢?

  不妨先把a和b的所有数都对2T取模,然后其实就是T<=ai+bj<2T 或者 3T<=ai+bj<4T

  排序+二分去统计就行了

  时间复杂度O(nlognlogc)

092E(构造)

题意:

  

分析:

  最终的结果一定是某些位置上的数字的和,且这些数字的下标位置是同奇偶的

  于是我们可以对于奇数位置和偶数位置分别去求个最大的和,比较一下就行了

  方案就构造一下就行了

092F(图论)

题意:

  n个点m条边的有向图。对于每条边都要回答询问,询问内容是“如果把这条边反转,那么图中的强连通分量的个数是否会改变”。

  n<=1000,m<=100000

分析:

  首先不妨对原图求一下强连通分量,对于每条边(u,v)有两种情况

  1、u和v在一个强连通分量中,那么这等价于判断如果删去边(u,v),u是否还能通过其它路径走到v

  2、u和v不在一个强连通分量中,那么这等价于判断如果删去边(u,v),u是否还能通过其它路径走到v(如果可以,那么v->u,就形成了强连通分量)

  所以问题的关键就是对于每条边如何快速判断如果删除这条边,那么还能否从u->v

  如果暴力去做的话,那么是O(m(n+m))是会TLE的

  我们考虑枚举每个点u去做一次dfs,在dfs过程中找出u的所有出边的答案

  对于u的所有出边所对应的点,我们按顺序标成v1,v2,...,vk

  我们按顺序从v1,v2,...,vk开始dfs,给尚未标号的节点进行标号,标号的内容是从哪个出边开始的

  我们再按顺序从vk,...,v3,v2,v1开始dfs,给尚未标号的节点进行标号,标号的内容是从哪个出边开始的

  那么v1,v2,...,vk都有两个标号了,分别是minlabel和maxlabel,如果某个vi的minlabel=maxlabel=i,那么从u->vi就只有这一条路能走

  做一次dfs的时间复杂度是O(n+m)的,总的时间复杂度是O(n(n+m))

转载于:https://www.cnblogs.com/wmrv587/p/8598151.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值