树状数组
麻袋君
这个作者很懒,什么都没留下…
展开
-
poj 2299 Ultra-QuickSort 求逆序对
题目大意: 给你一组序列,求得该组序列的逆序对; 解题思路: 这道题目可以用树状数组也可以用线段树; 在插入的过程中不断的查询当前位置之前的数字个数和,然后用当前的位置减去这个和即可,因为如果查找到比你小的数,则说明它们在序列中当前位置的前面,而现在插入的个数为当前数字的位置,所以用插入的个数减去比当前位置小的个数,即为在当前位置比当前位置数字大的已经插入的数字的个数,即逆序对; 但是这原创 2015-03-27 17:12:40 · 422 阅读 · 0 评论 -
poj 2352 stars 树状数组
题目大意: 给你n个坐标,统计每一个坐标左下角坐标的个数; 解题思路: 因为已经对坐标排序好了,所以直接按顺序插入,然后统计个数即可; 注意上限要开的大点,不然会爆错; 为了防止0的问题,应该将坐标左移1位; #include #include #include using namespace std; #define maxn 50010 int c[maxn]; int n; in原创 2015-03-27 18:25:11 · 387 阅读 · 0 评论 -
hdu 1556 color the ball
题目大意: 给区间染色,最后输出每个点的染色次数; 解题思路: 不管是向下修改,向上统计,还是向上修改,向下统计都可以,重点是理解更新和统计操作; 这里以正常向上修改,向下统计为例; 比如修改区间a,b,updata(a,1),updata(b+1,-1)这是什么意思?这里并没有修改整个区间,而是只是修改了区间开始,区间结束的下一个点总共俩个点,这样我们统计的时候直接getsum要求的点原创 2015-03-28 19:33:06 · 476 阅读 · 0 评论 -
poj 1195 Mobile phones
题目大意: 有几种操作 0 a:申请a*a的矩阵并且置零,只在第一条语句出现; 1 x y a:在(x,y)这个点加a 2 x1 y1 x2 y2 :求这个区间的和 3:结束 解题思路: 基本的二维树状数组操作,需要注意的是下标从0开始,所以遇到处理坐标的情况增加一位便可,避免处理0; #include #include #include using namespace st原创 2015-03-31 00:59:13 · 370 阅读 · 0 评论 -
poj 2029 Get Many Persimmon Trees 二维树状数组
题目大意: 给你K个柿子坐标,m*n的土地,问你取s*t的土地,最大可以取到多少个柿子 解题思路: 枚举所有可能的结束位置,然后通过树状数组算出矩形中的和即可; #include #include #include using namespace std; #define maxn 110 int c[maxn][maxn]; int m,n; int lowbit(int x) { r原创 2015-04-01 01:26:03 · 362 阅读 · 0 评论 -
poj 3067 Japan
题目大意: 给你k条路径,问这些路径有多少个交点; 解题思路: 开始的时候,我把第二个点降序,第一个点升序排列,但是处理了很久仍然wrong,没有办法,只能换网上的求逆序的方法; 我们用(x,y)描述边; 先将第一个x按升序排列,相同的时候则把y按升序排列,然后按照y的位置一边求逆序,一边更新; 为什么这样处理呢?我们已经将x升序排列了,后面要插入的边的x肯定小于等于前面的x,这样的情原创 2015-04-01 00:16:40 · 412 阅读 · 0 评论 -
poj 2482 Cows
题目大意: 农夫有很多牛,每个牛喜欢吃东西的范围为【si,ei】;如果牛j的范围[sj,ej]真包含牛i的范围,即Si Ej - Sj,则牛j比牛i强壮; 问对于每一头牛有多少牛比它强壮; 解题思路: 如果一头牛比另外一头牛强壮,则反应在坐标上它的坐标应该在弱的那头牛的左上方; 所以,我们可以先把e降序排列,如果e相等,则s升序排列; 因为e已经排好序,所以我们统计的时候只要考虑s原创 2015-03-31 20:04:34 · 422 阅读 · 0 评论