8.23训练总结

这几天回到老家没有电脑,只看了看知识点,也没有写程序和总结,惭愧......这几天主要看的是树状数组以及线段树的知识点。
树状数组是一种数据结构,在实现与解决某些问题的时候能够发挥优秀的作用,比如说常见的区间求和与区间查询更新等,如果用普通的数组来解决这种问题的话,往往会浪费大量的时间并且容易造成超时等等,如果用树状数组的话可以很好的解决这些问题,比如最经典的KiKi's  K-Number这一道题,只有三种简单的操作,插入数,删除数,查找比给出的树大的第k个数,如果我们用简单的数组肯定就是简单的使用循环来一个个查找,然后往往就会超时了。所以现在我们就应该使用树状数组来解决这一问题,还有就是当时看资料的时候没看懂return -t&t是什么意思,于是去网上查了查,就是求一下2^p的值,p是t的二进制表示数中从右往左数第一个1的位置。这道题的解析中还用到了二分的思想来查找,提高了效率。
线段树也是一种数据结构,是一种完全二叉树,也可以用来解决区间的变化后的查询问题,而且应用要比树状数组要广泛吧,经典的例题便是敌兵布阵问题,这道题与上面的那道树状数组的题类似,而且也可以用树状数组的来解决,不过用线段树来解决更好一点,给你n个数,然后每次做一些操作,比如把某个数增大或者减小,会问你某个区间内的和为多少,这道题思路很简单,我们可以直接直白的用循环来计算区间和,不过当次数过多区间过大的时候我们就会遇到超时的问题,而线段树可以解决这个问题,我们每次单点更新后都能更新区间值,再次查找时能够快速得到答案。
树状数组和线段树都是用来优化的方法,可以节约大量的时间,不至于tle。
不过只是看了看只是没有写程序实现也只是纸上谈兵罢了,肯定有很多地方自己没有注意到,等后天回学校将这几天的题补上。

你可能感兴趣的:(暑假集训)