进阶之路___(弱校联萌好题集合)

国庆还要集训真是心好累啊,然而艰苦奋斗是必经之路,让我们燃烧灵魂把

10.1

第一场的C题 http://www.bnuoj.com/v3/contest_show.php?cid=6865#problem/C

字符串处理的题目啊,看上去就觉得是KMP,但是我太水了,KMP算法理解不透彻,导致搞死了

这个题让我重新思考了KMP算法

处理的方法是开个栈,栈里面存对应p串的每一位在w串中匹配的位置,再开个数组存此时匹配进去的字符串,然后如果匹配成功,就把这一段从数组中减去,然后栈里面上面的那些也弹出,失配的j变为栈内最顶上存的那个值(就是他在w串中的匹配位置)

这个思想就很好理解了,也很容易实现,我真是太二逼了唉,仍须努力

AC代码 : http://paste.ubuntu.net/12631306/


B题 http://www.bnuoj.com/v3/contest_show.php?cid=6865#problem/B

给你一个数组,求一个数和前面每个数相加的进位的次数,然后求和

题解:原本以为是树状数组维护,但是进位特别复杂,直接GG

后来欣赏了cz大神的做法,感觉nbnb

比如考虑百位的进位,直接两个数模1000之后相加,就知道进位没有,而并不需要每一位都分开,还要考虑低位的进位

于是就是可以处理0-9位,然后每次把每个数模10的i次,然后存入数组A,再开个数组d2记录它如果要进位的话,值需要多大,然后给A数组排序,用d2的值去二分A数组,不过要记得去重,重复的就是当d1>=d2的时候,用d2去二分会取到自己的d1,然后ans-sum之后还需要除以2,因为i考虑到了和j做加法会进位,j也考虑了i的进位,所以要除以2,看来还是需要脑洞啊

AC代码 :http://paste.ubuntu.net/12631345/


http://www.bnuoj.com/v3/contest_show.php?cid=6867#problem/G

题意:给你一个有向的树,然后询问能否从起点到达终点

题解:看着挺简单,但是不知道怎么做,其实是用LCA做,建边的时候如果是正向的就值为1,逆向为0

然后LCA预处理,最后查询的时候就是从起点和终点同时找,但是起点走过的边都是值为1,终点走过的都应该为0,为了方便考虑就用位运算,每次走过的边或一下,正向值为2,反向为1.就可以了

AC代码 : http://paste.ubuntu.net/12704094/


题意:给你n个数,包括小数和负数,让你任取几个,使乘积最大
题解:有毒的一道题,不知道数据怎么出的,wa了好多发才过,主要是eps写的有点问题就wa了,然后自己还手误了一下
思路主要是如果有大于1的数肯定取,如果有两个负数乘积大于1也取,如果这样之后还是一个都没取,如果负数只有一个或者没有,就取最大的数,如果负数有多个,就比较最大的数,和最小的两个数的乘积谁大

题意:又是给你一棵树,每条边有权值,然后又新建了一条边,然后求新建之后的最短路比原来的树上的最短路节约了多少
题解:又是LCA维护,LCA求最短路是很明显的吧,然后再把查询的两个点和新建的边的两个端点泡一下LCA,然后加上新建的边,取最小值,和原来树上的最短路比较一下就好了


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值