题目1
题目2

开始BB

树状数组,类似于线段树,只不过处理问题范围相对小一些(???)
不过,优点在于时间,空间和代码复杂度都小得多。
对比一下(a是原数组):
线段树:

树状数组:


设tree为c
根据图可以知道,c[i]=a[i-2^k+1]+…+a[i] (k为i二进制下结尾0的个数)
设i=10=1010 (2)
因为结尾有1个0,所以10的父节点就是有2个0的节点。
即12 =1100(2)
很显然可以知道,只需要把10+2 (二进制下为10),就可以得到12。
2即等于2^1。
所以一个节点的父节点即为i+2^k。


比如我要求从1~10的节点和,要怎样用树状数组计算?
根据上面可以得知,树中一个节点的控制范围是在i-2^k+1~i。
那么把i减去2^k,可以得到?~i-2^k的范围 (?为新的i的k)
可以发现,这两个区间没有任何重合,中间也没有任何空缺。
所以可以直接把区间的和加上。
所以一个区间的下一个区间的结尾是i-2^k。


还有,如何求k?
还是以10为例:
10=1010 (2)

科普一下:
一个数的相反数的二进制等于它的补码+1
补码:即0变1,1变0
所以
+10=0000…01010
-10=1111…10110
是不是发现了什么???
如果一个数为00….00100…000,
那么反过来为11….11011…111
再加上一,为11….11100…000
后k+1为是相同的!
而且第k+1位一定为1,后面的都为0
所以很显然,K=i and (-i)

自己理解


所以上面给出的两道题目,解法就不细讲了
都是用树状数组搞一搞,然后算答案就行了

1978(模板题):

vard:array[1..100000] of longint;t:array[1..100000] of longint;power:array[1..100000] of longint;n,m,i,j,k,l,x,y:longint;ch:char;
procedure change(x,s:longint);
beginwhile x<=n dobegint[x]:=t[x]+s;x:=x+power[x];end;
end;
beginreadln(n);for i:=1 to n dobeginreadln(t[i]);d[i]:=t[i];end;for i:=1 to n dopower[i]:=i and (-i);for i:=1 to n-1 doif i+power[i]<=n thent[i+power[i]]:=t[i+power[i]]+t[i];readln(m);for i:=1 to m dobeginread(ch);readln(j,k);if ch='Q' thenbeginx:=0;y:=0;l:=j-1;while l>=1 dobeginx:=x+t[l];l:=l-power[l];end;l:=k;while l>=1 dobeginy:=y+t[l];l:=l-power[l];end;writeln(y-x);endelsebeginchange(j,k-d[j]);d[j]:=k;end;end;
end.

1979:

vart:array[1..32001] of longint;p:array[1..32001] of longint;n,i,j,k,x,y:longint;
beginreadln(n);for i:=1 to 32001 dop[i]:=i and (-i);for i:=1 to n dobeginreadln(x,y);inc(x);j:=x;k:=0;while x>=1 dobegink:=k+t[x];x:=x-p[x];end;writeln(k);while j<=32001 dobegininc(t[j]);j:=j+p[j];end;end;
end.

树状数组(oj1978 1979)相关推荐

  1. 洛谷 P5057 [CQOI2006]简单题(树状数组)

    嗯... 题目链接:https://www.luogu.org/problem/P5057 首先发现这道题中只有0和1,所以肯定与二进制有关.然后发现这道题需要支持区间更改和单点查询操作,所以首先想到 ...

  2. Color the ball(HDU1556)树状数组

    每次对区间内气球进行一次染色,求n次操作后后所有气球染色次数. 树状数组,上下区间更新都可以,差别不大. 1.对于[x,y]区间,对第x-1位减1,第y位加1,之后向上统计 #include<b ...

  3. 【BZOJ2434】[NOI2011]阿狸的打字机 AC自动机+DFS序+树状数组

    [BZOJ2434][NOI2011]阿狸的打字机 Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P ...

  4. Codeforces 629D Babaei and Birthday Cake(树状数组优化dp)

    题意: 线段树做法 分析: 因为每次都是在当前位置的前缀区间查询最大值,所以可以直接用树状数组优化.比线段树快了12ms~ 代码: #include<cstdio> #include< ...

  5. poj_3067 树状数组

    题目大意 左右两个竖排,左边竖排有N个点,从上到下依次标记为1,2,...N; 右边竖排有M个点,从上到下依次标记为1,2....M.现在从K条直线分别连接左边一个点和右边一个点,求这K条直线的交点个 ...

  6. hdu 1166 敌兵布阵(树状数组)

    题意:区间和 思路:树状数组 #include<iostream> #include<stdio.h> #include<string.h> using names ...

  7. Equalizing Two Strings 冒泡排序or树状数组

    首先考虑排序后相等 如果排序后相等的话就只考虑reverse长度为2的,所以a或者b排序后存在相邻两个字母相等的话就puts YES,n>26也直接puts YES 不然的话就假设c为a,b排完 ...

  8. Hdu 6534 Chika and Friendly Pairs 莫队算法+树状数组

    题目链接 题意求给区间[L,R]中有少对(i,j)满足i<j且abs(a[i]-a[j])<=k. 首先来说暴力的方法就是离散化,然后用树状数组来维护,但是m次询问,m很大,所以说一定会t ...

  9. HDU - 5877 Weak Pair 2016 ACM/ICPC 大连网络赛 J题 dfs+树状数组+离散化

    题目链接 You are given a rootedrooted tree of NN nodes, labeled from 1 to NN. To the iith node a non-neg ...

最新文章

  1. 024_Word知识汇总
  2. python的pandas_python之pandas(一)
  3. C: Answers to “The C programming language, Edition 2”
  4. spring配置文件_SpringBoot入门建站全系列(二十三)配置文件优先级及自定义配置文件...
  5. linux_软件安装策略和升级策略
  6. python 模块(Module)和包
  7. java final 方法重载_java方法重载和覆写的定义,static和final修饰符的讲解,java面试题...
  8. 不变性真的意味着线程安全吗?
  9. php5.6获取文件名,PHP 5.6:headers_sent间歇性地返回true,空文件名和第0行
  10. 力扣-面试题 16.10. 生存人数
  11. “OSPF” DR与BDR
  12. 执行mvn 报错 source-1.5 中不支持 diamond运算符
  13. Java使用for循环打印菱形
  14. 烧钱圈地后,医疗大数据如何变现?
  15. 制作u盘winpe启动盘_U教授工具如何制作U盘启动盘
  16. CSS3 3d立方体/多棱柱-
  17. MySQL安装后默认密码的问题
  18. OpenCV参考手册之Mat类详解(一)
  19. Maven打包Excel等资源文件损坏问题
  20. HTML 之 块级元素、行内元素和行内块元素之间的嵌套规则

热门文章

  1. Connections could not be acquired from the underlying database
  2. Activiti7子流程之Call activity
  3. 品质咖啡生活追求——Barsetto百胜图咖啡
  4. Angular 数据绑定
  5. python代码模拟宇宙天体_如何用python模拟一个星系?
  6. 数据库逻辑设计与物理设计
  7. 微信公众平台开发之LBS等API使用-php语言(六)
  8. 【Linux】通过 Shell 脚本修改用户密码
  9. 大数据社区研讨会 (第一届)
  10. 惊人的预测——来自2019麦肯锡报告《中国与世界》完整版