2021/12/31 校内比赛

Python微信订餐小程序课程视频

https://edu.csdn.net/course/detail/36074

Python实战量化交易理财系统

https://edu.csdn.net/course/detail/35475

1|0Problem D

其实是道很简单的二分题但考场上我一直想的是贪心。

每一次操作,任选一个不变其余减 111。

那么二分答案,对于二分到的答案 midmidmid,我们计算 ∑ai<mid(mid−ai)∑ai<mid(mid−ai)\sum\limits_{a_i<mid}(mid-a_i),如果小于等于 midmidmid 就是合法答案。

时间复杂度 O(nlogn)O(nlog⁡n)O(n\log n)。


2|0Problem H

很容易想到的一个逆向思维是,所有的人不动,而是电线杆动。

那么怎么解决电线杆与分身的碰撞呢?我们以横向运动为例。

假设电线杆现在在 (x0,y0)(x0,y0)(x_0,y_0) 点,要向右移动距离 lll,那么根据题意,满足 x∈[x0,x0+l]x∈[x0,x0+l]x\in[x_0,x_0+l] y=y0y=y0y=y_0 的分身都会被合并到点 (x0+l+1,y0)(x0+l+1,y0)(x_0+l+1,y_0) 上。

合并直接用并查集即可,关键在于如何找到这些该合并的点。

我们考虑以 xxx 升序最为第一关键字,yyy 升序作为第二关键字排序,不难发现的是,我们需要的点在一个区间上。

由于需要动态维护,我们用 set 维护,操作的时候 lower_bound 找到所需区间第一个点即可。

同理,处理上下移动时,我们需要以 yyy 升序最为第一关键字,xxx 升序作为第二关键字排序,需要再来一个 set。

对于时间复杂度,类似于启发式合并,是 O(nlogn)O(nlog⁡n)O(n\log n)。


3|0Problem I

分情况讨论:

  • 不在最短路上,且边变大:一定不会是新的最短路。
  • 不在最短路上,且边变小:将经过这条边的最短路与原来的最短路比较即可。
  • 在最短路上,且边变小:原来的最短路减去对应差值即可。
  • 在最短路上,且边变大:新的最短路可能是原来的最短路加上这段差值,也可能是删掉这条边做最短路。

因此,这道题中最复杂的部分其实就是如何做删边最短路。

我们先随便取出一条最短路,形成一条链。类似于断环法的思路,我们考虑删掉这条链上的一条边之后,以一条路径绕过这条边。

比如一条路径从 xxx 点从这条链出去,从 yyy 回来,那么这条路径就能作为 xxx 到 yyy 链上所有断边的"替代"。

按照这个思路,我们枚举每一条边 (u,v,w)(u,v,w)(u,v,w),尝试用 d1(u)+d2(v)+wd1(u)+d2(v)+wd_1(u)+d_2(v)+w 来更新对应的区间。由于到 uuu 是用的最短路(即 d1(u)d1(u)d_1(u)),因此我们在找 xxx 点的时候也要满足最短路的要求(即 1−x−u1−x−u1-x-u 的最短路就是 1−u1−u1-u 的最短路),再跑一遍最短路就可以完成找 xxx 点。找 yyy 点的时候同理。

由于只需要区间取最小值,我们用线段树维护即可。

时间复杂度 O(nlogn)O(nlog⁡n)O(n\log n)。


4|0Problem M

这好像是我做过的原题,但是时间太久远了我给忘了。

考虑到 nnn 很小,我们可以枚举行的所有状态,再枚举列贪心选择(111 比 000 多就翻),时间复杂度是 O(2nm)O(2nm)O(2^nm),需要优化。

设 aiaia_i 表示状态为 iii 的列的个数,bibib_i 表示在列在状态 iii 时贪心选最少的 111 的个数。

举个例子,对于状态 101111001011110010111100,bi=3bi=3b_i=3;对于状态 000101000001010000010100,bi=2bi=2b_i=2。

那么我们枚举行的状态 TTT,有:

ans=minT∑T⨁i=jaibjans=minT∑T⨁i=jaibjans=\min_T\sum_{T\bigoplus i=j}a_ib_j
由于 T⨁i=jT⨁i=jT\bigoplus i=j 与 i⨁j=Ti⨁j=Ti\bigoplus j=T 等价,转化成:

ans=minT∑i⨁j=Taibjans=minT∑i⨁j=Taibjans=\min_T\sum_{i\bigoplus j=T}a_ib_j
后半部分是 FWT 的模板,直接做即可。

要注意的是,虽然答案在 nmnmnm 以内,但是做的时候可能会超 int 范围,要开 long long。

时间复杂度 O(nlogn)O(nlog⁡n)O(n\log n)。

__EOF__

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yPQtnHT3-1642371702752)(https://blog.csdn.net/seketsu/p/15811517.html)]seketsu 本文链接:https://blog.csdn.net/seketsu/p/15811517.html关于博主:评论和私信会在第一时间回复。或者直接私信我。版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!声援博主:如果您觉得文章对您有帮助,可以点击文章右下角**【[推荐](javascript:void(0)😉】**一下。您的鼓励是博主的最大动力!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值