数据结构--树状数组
focus_best
这个作者很懒,什么都没留下…
展开
-
POJ 2182 Lost Cows(树状数组,暴力解法)
POJ 2182 Lost Cows(树状数组,暴力解法)分析: 其实这道题目只要会手算用例就能暴力解决。 假设读入题目给的数组a[n],其中a[1]=0这道题目只给出了在i之前且比位于第i个位置的值小的值有多少个,我们在纸上分析用例可知,最后一个数的值肯定是a[n]+1.然后我们从后往前推,且初始化一个数组vis[n]为全1。vis[i]表示当前值为i原创 2014-03-20 02:00:55 · 3354 阅读 · 0 评论 -
POJ 3378 Crazy Thairs(数据集中+DP+树状数组+高精度)
POJ3378 Crazy Thairs(数据集中+DP+树状数组+高精度)分析:由于数据值大量不大,所以读入所有的数并对数值从新映射到[1,5000].令d[x][i]=y表示在序列中以值x结尾,且x是作为升序5元组中的第i(i为1,2,3,4,5)个元素时,有y种可能.初值d[][]=0则从左往右读所有的a[i],假设当前读入的a[i]=x,那么d[x][1]=d[x][1]+原创 2014-03-17 21:03:25 · 1693 阅读 · 0 评论 -
HDU 1556 Color the ball(树状数组)
HDU 1556 Color the ball(树状数组)分析:每次涂色一个区间的时候,只能一个一个数改,然后查询的时候可以直接查询.如果这么做肯定超时.现在换一种思路:当我们在区间[a,b]涂色的时候,是不是从a点到b点之间的所有点的涂色次数都会加1,但是[1,a-1]和[b+1,n]区间的点都不会影响.我们依然令sum(a)表示a点的涂色次数而不是从1点到a点的涂色次数之和,所以我们在原创 2014-03-16 10:59:33 · 1414 阅读 · 0 评论 -
HDU 1394 Minimum Inversion Number(树状数组)
HDU 1394 Minimum Inversion Number(树状数组)分析:首先输入的是n个数从0到n-1的一个排列,所以我们先用树状数组求出这个排列的逆序数(第i个数的逆序是从第1个数到第i-1个数中比第i个数值大的数值的个数).注意树状数组的数值必须为正数,所以我们对于读入的所有ai都加上1.对于 a1 a2 a3…an,逆序为x,那么将a1(假设a1的值为y,那么比a1小的数原创 2014-03-15 18:26:11 · 1125 阅读 · 0 评论 -
HDU 2838 Cow Sorting(树状数组)
HDU 2838 Cow Sorting(树状数组)分析:首先每次只能交换相邻的两头牛,并且最后要求升序排列,所以最后整个序列的逆序是0,每次交换只可以消除1个逆序。(令a[i]的逆序是从1到i-1比它大的数的个数。)现在想问我们用插入排序的方式从左到右一个一个消除逆序的话,最后得到的时间和是最小的吗?是的。证明如下:对于每个原始的a[i],假设在它前面有x和y比a[i]大,所以a原创 2014-03-20 00:08:39 · 1080 阅读 · 0 评论 -
HDU 3450 Counting Sequences(树状数组+DP+离散化)
HDU 3450 Counting Sequences(树状数组+DP+离散化)分析:对于一个给定的序列a[n],令d[k][i]表示长度为k且以第i个元素为结尾的完美序列的个数。那么:d[2][i]+= sum{ d[1][j] | 1d[2][i]+= sum{ d[2][j] | 1我们最终所求是d[2][1]+d[2][2]+…d[2][n].由上面分析可知,快速的计算原创 2014-03-18 22:52:12 · 1359 阅读 · 0 评论 -
POJ 3067 Japan(树状数组:求逆序)
POJ3067 Japan(树状数组)注意题目中两边的岛是这么分布的:1 12 23 34 4且一个点最多只有两条边相交,即不可能出现3线共点的情况.假设现在1 4 是一条边,其他边我们暂时不知道,那么1 4边会有多少个交点呢?这主要跟右边的1,2,3(红色的)这三个数相交的左边的点有关,只要他们左边的点编号大于1,那么1 4就多一个交点.所以我们将获得原创 2014-03-15 17:03:17 · 1015 阅读 · 0 评论 -
HDU 3743 Frosh Week(树状数组或归并排序求逆序)
HDU 3743 Frosh Week(树状数组或归并排序求逆序)分析:首先这题类似于POJ2299:http://blog.csdn.net/u013480600/article/details/21277047其实题目就是给你n个数的排列,然后问你这n个数的逆序和是多少.可以用归并排序做,也可以用树状数组左,其中用树状数组做的话,每读入一个a[i],当前树状数组中先查找已经出现原创 2014-03-19 00:53:14 · 1284 阅读 · 0 评论 -
HDU 1166 敌兵布阵(简单树状数组)
HDU1166 敌兵布阵(简单树状数组)分析:树状数组的基本用法.AC代码:140ms#include#includeusing namespace std;const int MAXN=50000;int c[MAXN+1];int lowbit(int x){ return x&(-x);}int sum(int x)//此处x可以为0原创 2014-03-15 17:40:54 · 1253 阅读 · 0 评论 -
UVA1428 Ping pong(树状数组)
UVA1428 Ping pong一条大街上住着n个乒乓球爱好者,他们经常组织乒乓球比赛且每个人的能力值ai都不同.每次比赛需要2个比赛者和一个裁判,他们有一个奇怪的规定:当裁判的那个人必须住在这两个比赛者之间,且裁判的能力值也必须在这两个人之间.问一共有多少种比赛组织方式.输入:首先是T(1输出:比赛组织的总数.分析:对于第i个(任意一个)裁判,他能组织多少种比赛呢?假设a1原创 2014-03-10 12:39:09 · 1333 阅读 · 1 评论 -
POJ 2352 HDU1541 Stars(树状数组)
/*用归并排序求解#includeusing namespace std;const int MAXN=500000+100;int a[MAXN],b[MAXN];long long merge_sort(int *a,int *b,int i,int j)//归并排序并返回逆序值,a为待排序的数组,b为辅助空间{ if(i==j)return 0;原创 2014-03-15 12:18:14 · 1115 阅读 · 0 评论 -
POJ 2299 Ultra-QuickSort(树状数组+离散化 或 归并排序求逆序)
POJ2299 Ultra-QuickSort(树状数组+离散化或 归并排序求逆序)分析:每次只交换相邻的元素,到最后排序完成.因为交换相邻的元素只会序列的逆序数减1,到最后的没有逆序数.所以我们只需要计算初始序列有多少逆序,就可以知道要多少操作了.逆序:从左往右看每个元素,该元素左边值比他大的元素个数就是这个元素的逆序数.所有逆序相加就是整个序列的逆序.解法一:可以用归并排序来算逆序原创 2014-03-15 10:40:12 · 1310 阅读 · 0 评论 -
树状数组
树状数组关于树状数组的详细介绍可见刘汝佳《算法竞赛入门经典:训练指南》 对于一个n元素的数组A[n],可执行如下操作: Add(I, d):让A[i]变成A[i]+d。 Query(L, R):返回A[L]+A[L+1]+…+A[R]。 注意:树状数组只能计算A[1]开始的和,A[0]这个元素是不能用的。上面操作复杂度都是原创 2015-03-14 21:35:27 · 2412 阅读 · 0 评论