[置顶] 进阶之路___(弱校联萌好题集合)

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

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/


http://www.bnuoj.com/v3/contest_show.php?cid=6867#problem/E
题意:给你n个数,包括小数和负数,让你任取几个,使乘积最大
题解:有毒的一道题,不知道数据怎么出的,wa了好多发才过,主要是eps写的有点问题就wa了,然后自己还手误了一下
思路主要是如果有大于1的数肯定取,如果有两个负数乘积大于1也取,如果这样之后还是一个都没取,如果负数只有一个或者没有,就取最大的数,如果负数有多个,就比较最大的数,和最小的两个数的乘积谁大
AC代码 : http://paste.ubuntu.net/12710684/

http://www.bnuoj.com/v3/contest_show.php?cid=6942#problem/J
题意:又是给你一棵树,每条边有权值,然后又新建了一条边,然后求新建之后的最短路比原来的树上的最短路节约了多少
题解:又是LCA维护,LCA求最短路是很明显的吧,然后再把查询的两个点和新建的边的两个端点泡一下LCA,然后加上新建的边,取最小值,和原来树上的最短路比较一下就好了
AC代码 : http://paste.ubuntu.net/12710716/



你可能感兴趣的:(ACM)