
树状数组
ConwayTian
一切再来,为时未晚。
毁掉你人生的,其实是你内心的平庸,是你失去追求卓越的那个瞬间。
展开
-
POJ 1195 二维树状数组
题意:给定一个坐标系,每个点有一个值,值可以改变,求任意矩形所围的值得大小。#include using namespace std;#define S 1025int c[S][S], n;int lowbit ( int x ){ return x & ( -x );}void modify ( int x, int y, int v ){原创 2011-08-09 10:29:50 · 523 阅读 · 0 评论 -
HDU 4046 Panda 树状数组
题意:给你一个字符串,由'w' 和 'b' 组成,对该字符串有俩个操作,当输入为0 a, b时,询问区间[a,b] 内有多少个串 为 "wbw";当输入为1,k,,ch时,将下标为k的字符改为字符ch;#include #include using namespace std;int n, m;int c[60000];char str[60000]原创 2011-09-18 21:12:23 · 1443 阅读 · 0 评论 -
POJ 2481 树状数组
题意:有n只奶牛,每一只有自己的强度,用闭区间 [ l, r ] 表示, 若有两只奶牛,强度分别为 A = [ a, b ], B = [ c, d ],当c 题解:注意排序的选择,选s还是t,升序还是降序,都有影响,要保持树状数组的性质,更新时最好向上,求和时最好向下。另外,将这题的左右区间变成坐标的话,有点类似stars那题。#include using namespace原创 2011-08-10 20:32:08 · 683 阅读 · 1 评论 -
POJ 2155 二维树状数组
题意: 给出一个矩形的左上角和右下角(类似于矩阵), 被矩形框住的点需要改变它的值(0,1),给出一些操作,要求输出某点的值。本题是改变区域而求点。以二维树状数组来记录某点的改变次数。先想想一维数组,例如 c[1], c[2] , c[3], c[4], c[5], ....c[10], 假设要改变c[3]-c[5]间的区域,只需要把c[3]改变一次(它后面的点全都随之改变一次), 然后再将c原创 2011-08-09 15:31:30 · 582 阅读 · 0 评论 -
POJ 2352 Stars 树状数组
题意:有很多给定坐标的星星,求每个星星左下方的星星数。题解:用树形数组解。因为输入时y是升序,只要x1 >= x2 就可行。所以可以将二维视作一维,只考虑x就可以了。另外需要注意的是,树形数组不能从0开始,否则函数lowbit,和函数update死循环。这个问题可以将输入的x平移一个单位(即加1)来解决。#include #include int n, lev[16000原创 2011-07-23 22:17:19 · 507 阅读 · 0 评论 -
HDU 4031 Attack 树状数组
题意:911事件十周年之际,美国建立了一套新的防御系统。每个点都可以进行自动防御,但是防御过后该点的防御需要一段冷却时间,也就是说在此期间不能再进行防御。现在又两种操作:1.恐怖分子每次会对一段范围进行攻击。2.指挥官询问某点成功防御的次数。题解:参考http://blog.youkuaiyun.com/moorage/article/details/6785726#include using n原创 2011-09-20 20:15:15 · 1383 阅读 · 0 评论 -
HDU 1394 Minimum Inversion Number 树状数组/线段树
题意:给定一个数组 a1, a2, a3, ------ an, (是一个0-n-1的排列)。可以将它转换为以下形式。每次将前m个数提取出来放至末尾。a1, a2, ..., an-1, an (where m = 0 - the initial seqence)a2, a3, ..., an, a1 (where m = 1)a3, a4, ..., an, a1, a2 (wher原创 2011-09-01 16:46:13 · 743 阅读 · 0 评论 -
POJ 3067 树状数组
题意: 日本的东西海岸分别有 M, N 座城市,从北至南依次编号,现在东西海岸的某些城市之间修建公路,求所有交点的数量。题解: 若 a, b 两公路存在交点的话,必有 a.east b.west 或者 a.east > b.east, a.west #include #include using namespace std;#define N 1000005int n原创 2011-08-11 09:16:26 · 774 阅读 · 0 评论 -
POJ 3321 树映射到树状数组
题意: 有一颗苹果树,每一个节点生长一个苹果。有两种操作,Q(x) 输出某个节点的子树上一共有多少个苹果; C(x)存在苹果则摘下来,不存在则生出一个苹果。题解:很容易想到树状数组,而建立映射是关键。进行搜索给所有的节点编号,求出每一个节点管辖的范围(需包括节点本身和它子树上的所有节点)。然后只需对这些管辖区间进行维护,用树状数组。正如下图所示,每一个节点(即树杈)的编号是先序遍历原创 2011-08-10 16:29:46 · 792 阅读 · 0 评论 -
POJ 1656 二维树状数组
题意:给定100*100的网格,每个格子可以涂上黑色或者白色(初始时全部树白色),经过一系列操作后输出任意一个正方形区域内的黑色格子数。#include using namespace std;int c[110][110];int a[110][110];const int n = 100;int lowbit ( int x ){ return x原创 2011-08-09 19:07:20 · 593 阅读 · 0 评论