
树状数组与线段树
南山小翁
活在当下,要有思想,每个人不是随随便便就能成功!
展开
-
hdu1394求最小逆序数
线段树:单点更新#include#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1const int maxn=5100;int sum[maxn<<2];int x[maxn];int min(int a,int b){ return a>b?b:a;}void PushUp(int rt){ sum[rt原创 2013-03-06 18:54:46 · 737 阅读 · 0 评论 -
hdu 二维树状数组 简单题目 靠。。。。。扯蛋的悲哀,如果上天给我一种干掉你的愿望,我宁愿放弃——努力的结晶
#include#include#include#include#define maxn 1002using namespace std;int map[maxn][maxn];int T,t,Q;int x1,y1,x2,y2,n1;int lowbit(int n){ return (-n)&n;}int get_sum(int x,原创 2013-04-19 08:23:35 · 504 阅读 · 0 评论 -
poj3067 树状数组+优先队列 如果让我说:我只能说,实力代表一切
题意:在一个弹丸之地,有两排城市,每两个城市之间有一条道路相连,问有多少个可以产生交际思路:利用树状数组,求逆序数。首先对道路进行排序,然后求解。#include#include#include#include#includeusing namespace std;int c[1050];int Max;struct node{ int x;原创 2013-04-20 07:57:49 · 572 阅读 · 0 评论 -
hdu 2642 二维数组+判重 如果让我说:我只能说,实力决定一切
题意:给以一个二维区间,然后,在这个区间内,有星星,刚开始星星都不亮,让你对某个位置的星星点亮或者弄灭。然后求解在一个区间里照亮的星星的个数思路:很简单的水题,之所以水,因为样例,给你需要判重的样例。#include#include#include#include#includeusing namespace std;int x1,x2,y1,y2;int c[原创 2013-04-20 09:04:42 · 771 阅读 · 0 评论 -
poj3321 树状数组+DFS() 如果让我说:我只能说,实力决定一切
树状数组:对区间进行:①增②改③查思路:该题就是求解区间的值(该区间苹果的个数),因此 我们需要处理树杈的问题,当前的树杈是由哪个树杈引出来的,我们需要找到起始树杈(当前树杈)和结束的树杈,然后,在用树状数组去维护,进行查找,修改。用DFS()对当前树杈的起始点和终止点进行标号,类似二叉树的遍历(该题是多叉树)#include#include#include#include原创 2013-04-30 13:09:05 · 634 阅读 · 0 评论 -
poj2528线段树成段更新+离散化处理 鄙人 陷入沉思。。。。。
前天的多校联赛被虐成渣渣了,最后发现有一网络流,泪奔了,看了rank Most 1A, =。。=一怒之下,昨天看了一天网络流,感觉好不错,感觉没以前那么难了,可以搞。。。。。。今天就把剩余的线段树搞搞吧!这个题,看了别人的解题报告:思路:我们对区间进行更新的时候,需要离散化处理一下。简单的思路就是,把比较大的区间,离散化之后对应一个小区间,然后对小区间进行成段更新,但是有一个地方需要注意原创 2013-05-16 14:04:07 · 561 阅读 · 0 评论 -
http://acm.upc.edu.cn/problem.php?id=2174 无限悲哀中.....
思路:刚开始初始化那张表,A表示1,B表示0,然后利用二维树状数组就开始搞了,悲剧开始了,边界条件判断错误。当处理好之后,来了个TLE,打表建图不行,找规律建图。现在AC已经麻木了。。。。。。。。#include#include#include#include#define maxn 1100using namespace std;int map[maxn][ma原创 2013-05-17 08:40:10 · 2277 阅读 · 0 评论 -
poj2886 线段树+反素数
#include#include#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define max 500010int sum[max<<2];char Name[max][20];int num[max];int Max_fprime[max];int Max_num[max];int N,K;void get_fpri原创 2013-05-12 20:56:08 · 586 阅读 · 0 评论 -
hdu 1689 我要做的足够 强大
线段树成段更新: 昨天看了一晚上,不太理解,自己感觉弱爆了,今早想了想,发现成段更新和单点更新差不多,区别在于单点更新时,往下更新一直更新到叶子节点,成段跟新时,不必更新到叶子节点,当对一个区间操作完成之后,不在往下更新,当每次查询或者修改该区间时,在往下更新。提高了效率。#include#include#include#define lson l,m,rt<<1#def原创 2013-05-14 10:02:00 · 750 阅读 · 0 评论 -
http://poj.org/problem?id=1195二维树状数组
题意:给你一个n*n的矩阵,然后对其进行操作①一种操作:给(x,y,A)在坐标(x,y)上增加A,然后对子矩阵进行更新。②另一种操作:查找子矩阵(x1,y1,x2,y2)对其求值。思路:利用二维树状数组,对子矩阵进行更新和查找#include#include#include#include#define maxn 1111using namespace std;原创 2013-04-17 13:47:52 · 552 阅读 · 0 评论 -
http://poj.org/problem?id=2481 树状数组+优先队列
题意:给你一个区间[S,E],让你求解能够覆盖这个区间的区间的个数;思路:树状数组+优先队列。我们应该先固定E,即:先按照E从大到小排序,放到优先队列中,然后,每次弹出一个区间,利用树状数组往下查找,即可以找到比能覆盖当前区间的区间的个数,然后在向上更新区间。#include#include#include#include#include#define maxn 100100u原创 2013-04-16 21:16:57 · 683 阅读 · 0 评论 -
http://poj.org/problem?id=2299 树状数组 《复习》
//求解逆序数对:(后面的数比当前的数小的个数)//例:9 1 0 5 4//9的逆序数:91 90 95 94 共有4个//1的逆序数: 10 共有1个//0的逆序数: 为0个//5的逆序数:54为1个//4的逆序数:0个//所以9 1 0 5 4的逆序数共有6个#include#include#include#includeusing namespace std;st原创 2013-04-12 15:11:01 · 581 阅读 · 0 评论 -
poj2352 树状数组简单题
//题意:统计每个给定点的左下方(包括正左和正下)的点的个数.#include#include#define max 32100int ans[max],pox[max];int lowBit(int n){ return n&(-n);}//如果是x-=x&(-x);就是得到x这个点的管辖区间的下个区间的管辖点;int getSum(int x){ int s原创 2013-02-26 22:18:03 · 551 阅读 · 0 评论 -
树状数组
树状数组,小结_(优雅的数据结构)又做了几道树状数组的题,决定放一块儿总结一下;恩,总结一下。。(ps:大牛可以直接跳过。。。)这得从一张图说起;树状数组中用的d【】,每个点都有一定的管辖范围;如d[1]=a[1];d[2]=a[1]+a[2];d[3]=a[3];d[4]=a[1]+a[2]+a[3]+a[4];转载 2013-02-26 22:16:57 · 566 阅读 · 1 评论 -
hdu1556 简单的树状数组
题意:给你temp个数,用a,b表示temp次更新[a, b]区间,求出temp次后这temp个数的值.#include#includeint ans[110000];int temp;int lowBit(int x){ return x&-x;}int getSum(int x){ int sum=0; while(x<=temp) {原创 2013-02-27 19:49:43 · 1440 阅读 · 0 评论 -
poj2155 树状数组简单题
修改一个区间,查询一个点。#include#include#define max 1010int map[max][max];int N,T;int lowBit(int x){ return x&(-x);}int getSum(int x,int y){ int i,j; int sum=0; for(i=x; i>0; i-=lowBit(i原创 2013-02-28 18:06:45 · 422 阅读 · 0 评论 -
hdu1166
简单的线段树题目:单点更新。#include#include#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define max 50010int sum[max<<2];int map[max];void PushUp(int rt){ sum[rt]=sum[rt<<1]+sum[rt<<1|1];}void bui原创 2013-03-03 19:41:26 · 404 阅读 · 0 评论 -
hdu1754
线段树单点更新,找出区间最大值和更改区间点的值。#include#include#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define max 200010int N,M;int sum[max<<2];int Max(int a,int b){ return a>b?a:b;}void PushUp(int rt原创 2013-03-03 19:42:59 · 1622 阅读 · 0 评论 -
hdu2795 线段树单点更新
#include#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1const int maxn=300000;int MAX[maxn<<2];int h,w,x;int cmp(int a,int b){ return a>b?a:b;}void PushUp(int rt){ MAX[rt]=cmp原创 2013-03-18 11:20:03 · 516 阅读 · 0 评论 -
poj2828 线段树单点更新
#include#include#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define max 200010int sum[max<<2];int ans[200010];int tem1[200010];int tem2[200010];int n,t;void build(int l,int r,int rt){原创 2013-03-19 11:51:37 · 542 阅读 · 0 评论 -
poj3468 线段树成段更新
#include#include#include#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1using namespace std;const int Max=110010;long long op[Max<<2];long long sum[Max<<2];int N,Q,a,b,c;void Push原创 2013-05-14 10:26:53 · 555 阅读 · 0 评论