线段树树状数组
skymeteorite
这个作者很懒,什么都没留下…
展开
-
hdu1394线段树求逆序数
先将原数组每个值附上一个序号index,再将它排序。如题目的例子:num: 9 1 0 5 4index: 1 2 3 4 5排序后:num: 0 1 4 5 9index: 3 2 5 4 1然后由于排序后num为0的点排在原来数组的第3个,所以为了将它排到第一个去,那就至少需要向前移动两次,同时它也等价于最小的数0之前有2个数比它大(所以要移动两次),原创 2016-03-19 16:49:34 · 310 阅读 · 0 评论 -
hdu2795Billboard
http://acm.hdu.edu.cn/showproblem.php?pid=2795题意,一块宽w 高h的板,贴上若干宽为1的条,优先一行一行贴,贴不开换下行,问每个条所在的行数。使用线段树,根节点表示1-h,每个节点储存的是最大值,初始每个节点都没贴,也就是w,当找到叶子节点,且有足够大的空间贴广告时,改变域值,返回。如果当前区间的最大可用空间都不够用时,即可return。如果已经找到合适原创 2016-05-23 20:50:06 · 374 阅读 · 0 评论 -
hdu5775树状数组
考虑一个位置上的数字c在冒泡排序过程的变化情况。c会被其后面比c小的数字各交换一次,之后c就会只向前移动。数组从右向左扫,树状数组维护一下得到每个值右边有多少个比其小的值,加上原位置得到最右位置,最左位置为初始位置和最终位置的最小值。#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>using原创 2016-07-30 11:51:46 · 304 阅读 · 0 评论 -
hdu5792树状数组+容斥
http://acm.hdu.edu.cn/showproblem.php?pid=5792思路:用树状数组统计每个数前面比他小的数lmin,大的数lmax,后面比他小的数rmin,大的数rmax,不考虑条件总的数量是lmin,lmax的和,去掉不满足的:a=c rmax[]*rmin[] ,a=d lmax[]*rmax[] , b=c lmin[]*rmin[] ,b=d lmin[]*l原创 2016-08-04 19:49:49 · 286 阅读 · 0 评论 -
hdu1541树状数组
题意,计算每颗星左下有多少颗星,不包括自己注意树状数组不能处理x为0的时候#include<iostream>#include <cstring>#include <cstdio>using namespace std;const int MAXN=32005;int n=32005;int f[MAXN];int a[MAXN];//a[i]是横坐标为i的点的个数int lowbit(原创 2016-03-20 20:16:41 · 410 阅读 · 0 评论 -
poj2299离散化,树状数组
求序列正序对的个数#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn=500005;long long a[maxn],data[maxn];int c[maxn];int n;void lisan()//离散化{原创 2016-08-27 17:31:20 · 668 阅读 · 0 评论 -
hdu5023 线段树成段更新
lazy标记 成段更新模板,关键怎么记录颜色的种类,利用位运算,父节点的sum为子节点的sum相或,最后的值在用二进制哪位有1就是颜色几#include <iostream>#include <stdio.h>using namespace std;const int maxn=1000005;int sum[maxn<<2];int lazy[maxn<<2];void pushup(in原创 2016-08-08 20:02:34 · 280 阅读 · 0 评论 -
poj2481树状数组
每个牛有一个区间[s,e],两个牛[s1,e1], [s2,e2],当s1<=s2并且e1>=e2并且e1-s1>e2-s2时,我们说牛1比牛2强,给N个牛的区间,对于每个牛,输出比这个牛强的牛的个数。 还是需要预处理,先对每个牛的e进行降序排序,e相同时对s进行升序排列,这样循环时可以保证后边的牛绝对不比前边的牛强。在循环时,只需找出比当前牛s小的牛的个数。如果遇到特殊情况,即两个牛区间完全一样原创 2016-08-31 09:55:12 · 258 阅读 · 0 评论 -
hdu1540线段树区间合并
题意:是一条线上的点,D x是破坏这个点,Q x是表示查询以x所在的最长的连续的点的个数,R是恢复上一次破坏的点。线段树功能:单点修改,区间求值。分析: pre数组记录区间左端点开始的最大连续个数, suf数组记录区间右端点开始往左的最大的连续个数,sum数组表示该区间最大的连续点的个数。父亲区间内的最大区间必定是,左子树最大区间,右子树最大区间,左右子树合并的中间区间,三者中最大的区间值 #i原创 2016-08-31 09:56:20 · 401 阅读 · 0 评论 -
hdu5862树状数组 离散化
#include <iostream>#include <cstring>#include <stdio.h>#include <algorithm>#include <map>#define maxn 100010#define cle(a) memset(a,0,sizeof(a))using namespace std;typedef long long ll;struct原创 2016-08-31 12:02:59 · 332 阅读 · 0 评论 -
hdu5877dfs,树状数组离散化
第一个要求u 是v 的祖先,那么可以dfs,遍历到v时,所有他上方的都是满足第一条件的u,做多了树就很容易想到在退出某个子树的时候消除这个影响,这样就能保证所有有影响的都是祖先。要求w[u]*w[v]<=k,那么到v的时候,所有小于等于k/w[v]的u都满足,可以想到树状数组。结点的值最大10亿,肯定要离散化,离散化的时候要把k/w[v]加进去一起离散。#include <iostream>#in原创 2016-09-12 20:27:01 · 521 阅读 · 0 评论 -
hdu2838
http://acm.hdu.edu.cn/showproblem.php?pid=2838 题意 n个数的排列,每次可以互换相邻的元素,最终变成一个递增的序列,每次互换的代价为互换的两个数的和,求最小代价。 每次处理前i个,也就是顺序处理就是最小,假如第i个数为a[i],那么需要的代价为a[i]*c+sum(a[i]),c是a[i]前比a[i]大的数的个数,sum(a[i])是a[i]前比a原创 2016-05-19 17:19:17 · 560 阅读 · 0 评论 -
hdu4046panda
http://acm.hdu.edu.cn/showproblem.php?pid=4046 单点更新,区间求和,可以用树状数组,存wbw字符的组合#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int maxn=50005;int c[maxn];int n;char le原创 2016-05-18 11:32:22 · 389 阅读 · 0 评论 -
hdu3792
http://acm.hdu.edu.cn/showproblem.php?pid=3792 求n以内的孪生素数的对数,孪生素数: p和p+2都为素数. 这题暴力能过,用树状数组处理一下更快#include<stdio.h>#include<string.h>#include <iostream>#include <cmath>using namespace std;const int原创 2016-05-17 19:42:28 · 624 阅读 · 0 评论 -
hdu1166线段树单点更新
题目(http://acm.hdu.edu.cn/showproblem.php?pid=1166)#include <stdio.h>#include <string.h>int a[50010];struct node{ int left,right,sum;}b[150010];void build(int left,int right,int i){ int m原创 2015-08-07 17:28:31 · 353 阅读 · 0 评论 -
poj2823线段树
简单的区间求和 g++超时 c++过#include <iostream>#include <cstring>#include <cstdio>#include <cmath>using namespace std;const int MAXN=1000005;int MIN[MAXN<<2];int MAX[MAXN<<2];int MINS[MAXN<<2];int MAXS原创 2016-03-20 21:15:41 · 443 阅读 · 0 评论 -
poj2155二维树状数组
题意:给你一个n*n矩阵,然后q个操作,C代表把以(x1,y1)为左上角到以(x2,y2)为右下角的矩阵取反,Q代表询问当前(x,y)这个点的状况,是0还是1?#include<iostream>#include<cstdio>#include<cstring>#include<string>using namespace std;int n;int c[1001][1001];int原创 2016-03-20 21:31:35 · 255 阅读 · 0 评论 -
Exposition线段树
http://codeforces.com/problemset/problem/6/E给出数列 求最长连续子序列:最大值与最小值只差不超过k,如果多组都输出 并输出每组序列的头尾序号线段树存区间最大最小值 再枚举区间#include <iostream>#include <cstdio>#include <cstring>#include <cmath>using namespace原创 2016-03-21 21:19:22 · 288 阅读 · 0 评论 -
POJ1151Atlantis矩形面积并,线段树离散化
假想有一条扫描线,从左往右(从右往左),或者从下往上(从上往下)扫描过整个多边形(或者说畸形。。多个矩形叠加后的那个图形)。如果是竖直方向上扫描,则是离散化横坐标,如果是水平方向上扫描,则是离散化纵坐标。下面的分析都是离散化横坐标的,并且从下往上扫描的。 扫描之前还需要做一个工作,就是保存好所有矩形的上下边,并且按照它们所处的高度进行排序,另外如果是上边我们给他一个值-1,下边给他一个值1,原创 2016-03-22 17:30:21 · 743 阅读 · 0 评论 -
hdu1828线段树扫描线求周长
思想和扫描线求面积差不多#include<iostream>#include<string>#include<stdio.h>#include<algorithm>#include<cmath>using namespace std;struct node{ int l; int r; int len; //该区间可与下一个将要插入的线段组成并面积的长度原创 2016-03-22 20:31:02 · 452 阅读 · 0 评论 -
hdu1754线段树单点更新
http://acm.hdu.edu.cn/showproblem.php?pid=1754#include <iostream>#include <cstring>#include <cstdio>#include <cmath>using namespace std;const int maxn=200005;int MAXN[maxn<<2];void pushup(int rt)原创 2016-03-18 19:53:01 · 249 阅读 · 0 评论 -
poj3468线段树区间更新
http://poj.org/problem?id=3468裸的区间更新,lazy标记#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>#define LL long longusing namespace std;const int maxn=100005;struct Node{原创 2016-04-12 19:52:12 · 264 阅读 · 0 评论 -
hdu2689树状数组
http://acm.hdu.edu.cn/showproblem.php?pid=2689#include<iostream>#include <cstdio>#include <cstring>using namespace std ;int sum[1005];//记录每个元素个数int n ;int lowbit(int x){ return x&-x;}void upd原创 2016-03-27 19:47:27 · 573 阅读 · 0 评论 -
hdu1698Just a Hook
http://acm.hdu.edu.cn/showproblem.php?pid=1698 裸的线段树区间更新#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>using namespace std;const int maxn=100005;struct Node{ int su原创 2016-05-27 17:38:24 · 356 阅读 · 0 评论 -
hdu5475 线段树单点更新
http://acm.hdu.edu.cn/showproblem.php?pid=5475Problem DescriptionOne day, a useless calculator was being built by Kuros. Let's assume that number X is showed on the screen of calculator. At first, X =原创 2016-10-26 19:01:54 · 239 阅读 · 0 评论