苏格兰计划[副本] day2 CF949

day2 #469 div1(CF949)

这场的分数标的有点虚假,感觉至少要往上加200左右……而且题目太长了!差评!

A 1600

用并查集维护一下某个点后面一个位置还活着的点的位置就可以了,然后贪心每次取最长的就可以了,然后取出来以后的串如果是1结尾就是-1,所有元素没法全取出来也是-1,然后就做完了

B 1700

打表找一下规律或者稍微思考一下,可以想到,一个点如果被移动到某个位置pos,他之前必然是最后一个点,并且他前面还是隔一个空一个的,不然说明有一个点先填补了不是最后一个空格的空格,所以说pos前面有pos/2-1个数字,所以pos后面有n-pos/2个连续的数字,所以可以反推pos位置的数字之前的位置pos+n-pos/2,然后根据初始每个点都在奇数位置就可以知道反推到pos是奇数就可以停止了

C 1900

现在有若干个点,我们要把尽可能少的点点权变成该点+1%h,使得每一条边连接的两个点权不一样,而且可以注意到他原来是一定保证连接边的两边边权都不一样的。
所以只用枚举每一个点,判断将他推迟一个单位,至少要推迟其他多少个点,那就把这个点和所有他延迟后必须调整的边建单向边,然后由于这玩意是模意义下的……所以可能成环,于是就是tarjan先缩点,然后图变成了一张DAG,这个时候跑拓扑排序,显然拓扑到最后剩下的这若干个零出度点中选取大小最小的就是答案,因为选其他点都会导致额外的点被删除

D 2300

挺有意思的一个贪心题,而且比较优的一个想法肯定是宿舍要么满人要么没人,并且学生跑的比大妈先,所以一个人能跑到偏两边的寝室就必然能跑到偏中间的寝室。于是一个贪心策略就是两边一起往中间填,如果能填就填,不能填就把人全拿走,其实可以分成独立的两半处理,左半边做法是先维护一个前缀和,然后到第i个点的时候,假设之前已经贪心填了k个点,先判断从哪个宿舍可以跑到第i个点,然后做前缀和判断从头到最远的那个宿舍之间的人数能否达到(k+1)*b,如果能,贪心填就可以了,很显然因为总人数是可以填满所有宿舍的,所以不会有因为填了左边导致本来右边能填填不了的情况,所以可以独立先做左边再做右边,然后两边分别做好,然后减一减得出两边空出来的最小空间就可以了

E 2700

第二组样例有另外一个解-1 4 8,这给我们一个启示,每个i只会出现一次,因为选 2 i 2^i 2i 2 i 2^i 2i,还不如选 2 i 2^i 2i 2 i + 1 2^{i+1} 2i+1,其次每个i要么选正的要么选负的,因为选了选 − 2 i -2^i 2i 2 i 2^i 2i,还不如选 − 2 i -2^i 2i 2 i + 1 2^{i+1} 2i+1,于是可以逐位讨论,但是取负还是取正说不好,所以要是暴力枚举复杂度就是 2 20 ∗ n 2^{20}*n 220n,但其实每去掉一位值域就会减半,所以其实有很多都是重复的,于是每次sort并且去重,复杂度就降下来变成了( 2 ∗ n + 2 ∗ 2 ∗ n / 2 + . . . = 2 n ∗ 20 2*n+2*2*n/2+...=2n*20 2n+22n/2+...=2n20)

F

pdf文件,不知道难度,咕咕咕了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值