
数据结构-树状数组
文章平均质量分 78
围巾的ACM
啊啊什么时候也能成为一个大牛啊
展开
-
CodeForces 635D Factory Repairs(树状数组)
题意:有n天,每天普通情况下可以产生b个东西,维修完机器的情况下可以产生a个东西,由普通的情况到好的情况需要k天的休息,就这k天啥也干不了,现在有q次询问现在你有两个操作 1 x y,表示订单第x天需要y个东西 2 x 在第x天进行休息,然后问你最多能够满足多少个东西的需求思路:直接树状数组维护一下,k天以前每个点的最大值为b,k天以后每个点的最大值原创 2016-03-29 13:47:47 · 433 阅读 · 0 评论 -
BZOJ 1878 HH的项链(离线树状数组)
思路:显然在线做有点坑...尝试离线做了一发树状数组,维护每个数出现的位置以及下一次这个数出现时候的坐标,将询问按照左端点递增排序,扫一遍过去,如果该数字第一次出现的位置已经脱离了询问的范围那么就可以插入下一次这个数出现时候的坐标了,因为之前的出现与否和以后的询问已经没有关系#includeusing namespace std;const int maxn = 1000000+5原创 2016-07-09 21:12:57 · 531 阅读 · 0 评论 -
Gym 100463A Crossing Number(树状数组)
思路:定义每个数为(a*i+b)%n,然后求这个序列的逆序,直接树状数组搞#includeusing namespace std;#define LL long longconst int maxn = 1000000+500;int c[maxn];int lowbit(int x){return x&(-x);}void update(int i,int d){ w原创 2016-07-09 22:30:27 · 400 阅读 · 0 评论 -
Gym 100114H Milestones(离线树状数组)
思路:和之前那题一样,找区间不重复的数出现多少个,离线树状数组即可#includeusing namespace std;const int maxn = 100000+500;struct Node{ int l,r,id,ans;}que[maxn];int c[maxn],p[maxn],next[maxn],a[maxn];int lowbit(int x){r原创 2016-07-10 16:02:31 · 548 阅读 · 0 评论 -
BZOJ 2743 采花(树状数组)
思路:统计区间出现次数大于等于两次的数字个数,显然在线做会gg,我们离线保存每个询问,按照左端点排序,记录每个数字第一次出现的位置以及下一次出现的位置,然后扫一遍,如果l#includeusing namespace std;const int maxn = 1e6+7;int c[maxn],a[maxn],p[maxn],next[maxn];int lowbit(int原创 2016-07-10 22:58:15 · 419 阅读 · 0 评论 -
CodeForces 652D Nested Segments(树状数组+离散化)
题意:给你n条线段,保证端点不完全重合,问每条线段包含了多少条线段。思路:只有最多2e5个线段,所以我们可以先离散化一下。然后将每条线段都按左端点排序,将每个线段的右端点用树状数组维护,那么就可以直接扫一遍,由于左端点已经是有序的了,i+1的线段不会包含i,所以还需要将i线段的右端点删除,当然需要注意的是如果左端点相同,排序的时候要按右端点大的来排序,自己画个图就知道了#inclu原创 2016-07-10 23:03:27 · 518 阅读 · 0 评论 -
HDU 5542 The Battle of Chibi(DP+树状数组)
思路:求递增子序列个数为M的方案数,显然有一个很简单的DP是dp[i][j]=sum(dp[i-1][k]) (a[k]#includeusing namespace std;const int maxn = 1005;const int mod = 1e9+7;#define LL long longint dp[maxn][maxn];int a[maxn],b[max原创 2016-07-25 19:43:46 · 702 阅读 · 0 评论 -
POJ 2155 Matrix(二维树状数组)
思路:一个二维树状数组即可轻松解决参考见:点击打开链接#include #include #include #include #include #include #include #include #include using namespace std;const int MAX = 1010;int c[MAX][MAX];int n;int Lowb原创 2016-08-03 21:50:43 · 253 阅读 · 0 评论 -
POJ 1195 Mobile phones(二维树状数组)
思路:裸的二维树状数组#include#include#includeusing namespace std;int n;const int maxn = 1500;int c[maxn][maxn],a[maxn][maxn];int lowbit(int x){return x&(-x);}void update(int x,int y,int num){ fo原创 2016-08-03 22:04:23 · 320 阅读 · 0 评论 -
SGU 180 Inversions(树状数组求逆序对)
思路:典型的树状数组求逆序对,需要离散化并且数字可能有重复的#include#include#include#include#includeusing namespace std;#define LL long longconst int maxn = 70000+50;LL c[maxn];int a[maxn],b[maxn];vectorv;int geti原创 2016-08-03 23:10:31 · 345 阅读 · 0 评论 -
Codeforces Round #365 (Div. 2) D. Mishka and Interesting sum(离线树状数组)
思路:首先在线的我不会做...题目没有修改操作,那么可以考虑离线的做法,考虑到异或有一个性质a^a=0,即出现次数为偶数的话那么异或起来为0,假设有一个序列为1,2,1,3,2的话,如果我查询区间[1,5],那么可以留意到把这个区间所有的数1^2^1^3^2算出来,然后再异或这个区间的数字1^2^3,那么最后结果就是1^2,恰好就是出现偶数次的数字的异或和,那么就可以预处理出所有的前缀异或和,对询原创 2016-08-05 10:28:17 · 576 阅读 · 0 评论 -
hdu5877 Weak Pair(DFS+树状数组)
思路:查询a[u]*a[v]=k/a[u],那么离散一下,在DFS的时候用树状数组统计一下就可以了#includeusing namespace std;const int maxn = 2e5+7;#define LL long longLL lowbit(LL i){return i&(-i);}LL c[maxn],a[maxn],k,ans=0;vectorv;v原创 2016-09-11 17:31:59 · 660 阅读 · 0 评论 -
Codeforces Round #368 (Div. 2) E Garlands(二维树状数组+暴力)
题意:给你n*m的矩阵,有k条链,两种操作,你可以每次修改一条链的值,使之变为0或者恢复原来的值,或者查询一个子矩阵的权值和思路:n,m,k只有2000,并且留意到题目说查询权值和的操作最多只有2000次,那么就可以不用每次修改的时候就马上修改,而是选择给它一个标记,到了询问的时候再遍历一次所有链来修改,有点类似线段树的lazy标志一样,查询子矩阵的权值和显然的做法就是用一个二维树状数组,这样原创 2016-08-24 12:54:07 · 698 阅读 · 0 评论 -
HDU 5493 Queue(二分+树状数组)
思路:显然的要字典序最小那么就离线先把身高排个序然后一个个插,对于某一个人来说,他的位置有可能在p[i].h+1,或者n-i-p[i].h+1这两个位置,然后二分前面有多少个位置来插入就可以了#includeusing namespace std;const int maxn = 100000+7;int c[maxn],ans[maxn];int lowbit(int x){原创 2016-09-16 00:54:26 · 586 阅读 · 0 评论 -
POJ 3321 Ultra-QuickSort(树状数组+DFS序)
思路:有两种操作,如果结点X有苹果那么拿掉,否则加一个苹果,操作二询问以某个结点为根的子树有多少个苹果,显然一开始给出的树的结点编号是无序的不利于维护,那么可以考虑DFS将结点都重新编号,那么一个子树的结点编号一定是连续的,然后用树状数组维护即可坑点:会卡STL#include#include#include#includeusing namespace std;cons原创 2016-08-13 23:35:51 · 359 阅读 · 0 评论 -
HDU 2852 KiKi's K-Number(树状数组)
思路:三种操作,增加一个数,减少一个数,询问大于某个数的第k个数 第一种操作就是普通的update,第二个询问前先求query(x)-query(x-1)是否为0,为0就是没有这个元素,第三个操作大于某个数的第K个数相当于求第query(x)+k个数,那么二分一下就可以了#includeusing namespace std;const int maxn =原创 2016-08-14 10:31:25 · 341 阅读 · 0 评论 -
UESTC 842 天下归晋(树状数组)
思路:按x轴排序之后,树状数组维护y轴#includeusing namespace std;const int maxn = 100000+500;int c[maxn],ans[maxn];struct Node{ int x,y;}a[maxn];bool cmp(Node a,Node b){ if(a.x==b.x) return a.y<b.y;原创 2016-07-09 20:45:42 · 801 阅读 · 0 评论 -
UESTC 841 休生伤杜景死惊开(树状数组)
思路:正着求一次逆序然后反着求一次,相乘就可以了#includeusing namespace std;#define LL long longconst int maxn = 50000+500;LL ans1[maxn],ans2[maxn];int c[maxn],a[maxn];int lowbit(int x){return x&(-x);}void updat原创 2016-07-09 20:44:34 · 878 阅读 · 0 评论 -
UVA1428 Ping pong(树状数组)
题意:一条大街上住着n个乒乓球爱好者,他们经常组织乒乓球比赛且每个人的能力值ai都不同.每次比赛需要2个比赛者和一个裁判,他们有一个奇怪的规定:当裁判的那个人必须住在这两个比赛者之间,且裁判的能力值也必须在这两个人之间.问一共有多少种比赛组织方式.其实就是一个数列(不一定有序)要你找任意三个数递增或递减的组合数思路:一个有点像经典滑窗的题目。 对于某个位置i,我原创 2016-02-19 21:47:27 · 351 阅读 · 0 评论 -
HDU 1166 敌兵布阵(简单树状数组)
题意:中文题思路:简单树状数组应用#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;#define maxn 50000+100原创 2016-02-19 16:34:52 · 273 阅读 · 0 评论 -
POJ 2299 Ultra-QuickSort(树状数组+离散化)
题意:给你一个n个整数组成的序列,每次只能交换相邻的两个元素,问你最少要进行多少次交换才能使得整个整数序列上升有序。思路:首先要知道怎么求逆序数,从左往右看每个数字,该元素左边值比他大的元素个数就是这个元素的逆序数。所有逆序相加就是整个序列的逆序.统计元素左边比它大的元素个数,是不是和UVA1428很像了,只不过之前求小的,现在求比它大的那么就是sum(n)-sum(a[i])就是了。题目还有原创 2016-02-20 15:51:11 · 395 阅读 · 0 评论 -
POJ 2481 Cows(树状数组)
题意:有n头牛,每头牛对应一个区间[Si,Ei],如果牛j 的区间是牛i 的区间的真子集(即Si Ej - Sj),那么就说牛i 比牛j 强壮。要你依次输出比第i头牛强壮的牛数目。思路:如果将所有牛的E区间按从大到小排序(如果E相同,则S小的排在前面)的话,那当前读取到第i个牛的Si和Ei,那么之前(假设任意牛的区间不会完全相同)的牛的Sj(jTrick:这里有可能有两个区间一模原创 2016-02-21 15:41:40 · 715 阅读 · 0 评论 -
POJ 2352 HDU1541 Stars(树状数组)
题意:二维平面给定n个点的坐标,然后要你输出每个点的“等级“。每个点的等级是它的左下放的点个数(包括正下放和正左方的点)。即要你输出对于每个点(x,y)来说,有多少点的坐标(xi, yi)满足xi思路:题目给出的坐标中已经是按y升序排列,那么其实只用考虑x轴,那么显然就是在前面的点中找比自己小的。Trick:注意的是累加的时候while循环的条件要改一下,因为我们这里是用x轴坐标的值作原创 2016-02-20 22:23:29 · 329 阅读 · 0 评论 -
HDU 1394 Minimum Inversion Number(树状数组)
题意:有一个n个整数的排列,这n个整数就是0,1,2,3...n-1这n个数(但不一定按这个顺序给出)。现在先计算一下初始排列的逆序数,然后把第一个元素a1放到an后面去,形成新排列a2 a3 a4...an a1,然后再求这个排列的逆序数。继续执行类似操作(一共要执行n-1次)直到产生排列an a1 a2...an-1为止。计算上述所有排列的逆序数,输出最小逆序数。思路:首先由于给出的序原创 2016-02-22 13:16:35 · 337 阅读 · 0 评论 -
POJ 3067 Japan(树状数组:求逆序)
题意:水平方向有2n个城市点,他们分别按顺序分布在平行的两条直线上,编号都是从1到n。然后现在在上直线与下直线的两个城市点之间建公路,一共建k条公路。问你这k条公路一共有多少个交点(保证最多只有两条公路会交于同一点)?思路:这题画个图就一目了然了,我们将获得所有边以y坐标从小到大排序,如果y坐标相同,则x坐标小的排在前面。那么我们当前扫描到的xi,yi边有多少个交点?只要看xi前面有多少个xj原创 2016-02-21 22:51:05 · 979 阅读 · 0 评论 -
HDU 3743 Frosh Week(树状数组+离散化)
题意和思路:和POJ2299几乎一样...离散化+树状数组#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;#define maxn 1原创 2016-02-22 13:21:57 · 563 阅读 · 0 评论 -
HDU 2838 Cow Sorting(树状数组)
题意:首先每次只能交换相邻的两头牛,并且最后要求升序排列,所以最后整个序列的逆序是0,每次交换只可以消除1个逆序。(令a[i]的逆序是从1到i-1比它大的数的个数。)思路:对于某个数,要把它变成有序的,那么很容易可以推算出公式就是它自身的逆序数乘自身的值再加上它的逆序数的和,自己算算看看。吐槽:一开始没想清楚树状数组下标的问题,后来没注意会爆int搞了好久...#include原创 2016-02-22 21:02:12 · 363 阅读 · 0 评论 -
HDU 1556 Color the ball(树状数组区间更新)
题意:中文题思路:一道区间更新,单点查询的裸题,用线段树做更好,因为还没看到所以这里用树状数组做。树状数组标记区间的方法很特别,比如给区间[a,b]内的气球涂颜色时,我们add(a,1),add(b+1,-1),单点查询的时候sum(x)就是x这个气球被涂色的总次数。建议先在纸上自己试一下看看,有点抽象,可以这样理解,如果更新区间[3,5],那么我等于在3这个点+1,代表从3之后所有的点都增加原创 2016-02-22 22:17:45 · 368 阅读 · 0 评论 -
CodeForces 658B Bear and Displayed Friends(树状数组)
题意:有n个人,屏幕上最多显示k个人,如果有超过k个人,则按权值大的显示在前面,有q次询问,两种操作,1,x代表x人上线,2,x代表询问x在不在屏幕上思路:用个树状数组维护就好了...#include #include #include #include #include #include #include #include #include #include原创 2016-04-03 20:06:05 · 532 阅读 · 0 评论 -
CodeForces 652D Nested Segments (树状数组)
题意:给你n个区间,问每个区间包含了多少个区间思路:先离散化一波,然后就是显然的树状数组瞎搞了...和POJ2458差不多#include #include #include #include #include #include #include #include #include #include #include #include #include u原创 2016-04-04 11:07:37 · 1033 阅读 · 0 评论 -
CodeForces 669E Little Artem and Time Machine(树状数组)
题意:有三个操作 1 x y,在第x秒插入一个y 2 x y,在第x秒移走一个y 3 x y, 问第x秒有多少个y思路:听说是可持久化Treap...不过好像无脑树状数组也行#includeusing namespace std;const int maxn = 1e6+1;mapc[maxn];mapvis;int tot = 0;int原创 2016-04-27 16:08:19 · 781 阅读 · 0 评论 -
BZOJ 1012 最大数maxnumber(树状数组)
思路:树状数组,维护区间最大值#includeusing namespace std;const int maxn = 2000005;int c[maxn],num[maxn];int lowbit(int x){return x&(-x);}void update(int x){ c[x]=num[x]; for(int i = 1;i<lowbit(x);i<<原创 2016-07-09 20:42:34 · 462 阅读 · 0 评论 -
UESTC 838 母仪天下(树状数组)
思路:树状数组裸题#includeusing namespace std;const int maxn = 100000+500;int c[maxn],a[maxn];int lowbit(int x){return x&(-x);}void update(int i,int d){ while(i<maxn) { c[i]+=d; i+=lowbit(原创 2016-07-09 20:43:23 · 464 阅读 · 0 评论 -
CodeForces 341D Iahub and Xors(二维树状数组)
思路:典型的二维异或树状数组,有一个结论是在x位置放置了一个元素,只会对x+2,x+4等位置产生影响#includeusing namespace std;#define LL long longconst int maxn = 1005;LL lowbit(LL x){return x&(-x);}LL c[2][2][maxn][maxn];int n,m;void原创 2016-09-29 09:45:56 · 662 阅读 · 0 评论