您的位置:首页 > 其它

暑假集训日记--8.16--练习赛题+树状数组

2017-08-16 22:28 211 查看
今天上午又做了一遍昨天练习赛的A题,一道搜索题,但还是用了不少时间去调试代码。所以别的题也只是看了看。有一道是以前做过的题。感觉改题真的太浪费时间了。。所以要及时做好总结,写代码的时候争取认真注意细节。

下午又开始学新的东西了。上一周学的优先队列,做的几个题感觉都差不多。上一个专题也差一个题AK。看了看题。。感觉太麻烦了。。于是开始看树状数组。

对于树状数组,先是看了看算法竞赛的书上的内容,了解了树状数组的结构以及运用过程。树状数组可以高效的解决一些问题。例如区间的信息的查询等。而其比较主要的两个操作就是Add和Sum操作。

而对于树状数组,也要注意其下标的问题。树状数组用的比较多的还是求某一区间的和。

下面是比较常用的两个Add和Sum的实现方式。

先写一个计算二进制最右边1的代码:

int lowbit(int i)
{
return i&(-i);
}


然后Add操作:即令A[i] += v
void add(int i,int v)
{
while(i<=n)
{
c[i] += v;
i += lowbit(i);
}
} 然后是Sum操作:即求得A[1] + ... + A[i]的和
int Sum(int i)
{
int sum=0;
while(i>0)
{
sum += c[i];
i -= lowbit(i);
}
return sum;
} 要注意的问题是刚开始的数组要全部置为0,然后输入A[i]的过程中对C数组进行初始化。
明天还要继续看树状数组的相关内容,然后及时总结树状数组的练习题。用例题来加深对于树状数组的理解。

明天还要继续努力。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: