随笔分类 -  数据结构--线段树/树状数组

摘要:1523这题应该说有一些DP的思想吧 dp[i][j]表示以i为结尾第j个数的个数 k单调下降 直接求的话肯定超时 然后用树状数组来进行维护求k-1次树状数组 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define lowbit(x) x&(-x) 8 #define N 20010 9 #define LL long long10 #define mod 100000000011 int dp[N][12],n,a[N],po[N],sum[N][12];12 vo 阅读全文
posted @ 2013-10-01 12:00 _雨 阅读(427) 评论(0) 推荐(0)
摘要:1890将树的每个节点都转换为区间的形式 然后再利用线段树对结点更新 这题用了延迟标记 相对普通线段树 多了dfs的转换 把所要求的转换为某段区间RE了N次 最后没办法了 记得有个加栈的语句 拿来加上A了。。 1 #pragma comment(linker, "/STACK:102400000,102400000") 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 using namespace std; 9 #define N 50010 10 #define LL long lon 阅读全文
posted @ 2013-10-01 11:51 _雨 阅读(334) 评论(0) 推荐(0)
摘要:1521根据区间和 来确定第k个数在哪 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define N 100010 8 int s[N>1;21 build(l,m,w>1;34 if(k=r)43 {44 return s[w];45 }46 int m = (l+r)>>1,re=0;47 if(am)50 re+=getsum(a,b,m+1,r,w<<1|1);51 return re;5... 阅读全文
posted @ 2013-09-27 18:09 _雨 阅读(370) 评论(0) 推荐(0)
摘要:1470最简单的三维树状数组 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define lowbit(x) x&(-x) 8 int re[130][130][130],n; 9 int getsum(int x,int y,int z)10 {11 int s = 0,i,j,g;12 for(i = x; i >= 1 ; i -= lowbit(i))13 for(j = y ; j>= 1; j -= lowbit(j))14 ... 阅读全文
posted @ 2013-09-25 22:23 _雨 阅读(194) 评论(0) 推荐(0)
摘要:1019离散化都忘记怎么写了 注意两个端点 离散化后用线段树更新区间 混色为-1 黑为2 白为1 因为N不大 最后直接循环标记这一段的颜色查找 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define N 100010 8 #define LL long long 9 struct node 10 { 11 int d,id; 12 char c; 13 }li[N>1; 24 build(l,m,w=r) 30 { 31 ... 阅读全文
posted @ 2013-09-23 13:25 _雨 阅读(260) 评论(0) 推荐(1)
摘要:链接裸线段树 这题时间卡的挺棒 1 #include 2 #include 3 #include 4 #include 5 #include 6 7 using namespace std; 8 #define N 1000010 9 #define INF 0xfffffff10 int s[N>1;26 build(l,m,w=r)33 {34 return lm[w];35 }36 int m = (l+r)>>1,ans = INF;37 if(am)40 ans = min(ans,query1(a,b,m+1,r,... 阅读全文
posted @ 2013-09-16 13:03 _雨 阅读(188) 评论(0) 推荐(0)
摘要:链接神奇的扫描线啊估计之前刷面积并的时候太急了 没来得及理解 。。有一大段代码是与面积并一模一样的 都是离散化 更新面积并是扫描的x 这次也一样因为周长只算外围的 所以扫描到一条x边时 要减去上一次扫描到的 对于Y方向上 就是与面积并不大一样的地方了看篇带图的讲解吧 网上的题解都大同小异 估计出自一人之手http://blog.sina.com.cn/s/blog_691ce2b7010177dz.html它是扫描的Y 其实方法是一样的 横过来就是对于我的代码 自己感觉不好理解在于求区间数 1 #include 2 #include 3 #include 4 #include 5 ... 阅读全文
posted @ 2013-09-13 19:38 _雨 阅读(298) 评论(0) 推荐(0)
摘要:链接这树着实不好理解啊讲解http://www.cnblogs.com/pony1993/archive/2012/07/17/2594544.html对于找K值 右区间的确定不是太理解。。先当模板贴着吧 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define N 100010 8 int tree[20][N],sum[20][N];//每层的数 及每层截止到i会放进左子树的个数 9 int cu[N],xu[N];//原数据 及排序后的数据10 void build(.. 阅读全文
posted @ 2013-09-13 19:13 _雨 阅读(288) 评论(0) 推荐(0)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2852区间K值写错了。。。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define N 100010 8 #define lowbit(x) (x&(-x)) 9 int s[N>1;18 if(p>m)19 add(p,da,m+1,r,w=r)27 return s[w];28 int m = (l+r)>>1,ans=0;29 if(am... 阅读全文
posted @ 2013-08-14 19:42 _雨 阅读(242) 评论(0) 推荐(0)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4638求某一区间所包含的连续的段 对于乱序的数 到了i这个数所包含的段数 首先把这个数看作单独的段 再看一下前面是否出现了它的朋友 若出现了就说明前面已经加过这样单独的段了 就把前面的更新掉-1 这样始终保证一个段的最后一个值记录着这是第几个段 从左到右扫描一遍 离线处理后 这样用树状数组或者线段树进行区间求和就可以了 1 #include 2 #include 3 #include 4 #include 5 #include 6 #define N 100010 7 using namespace std. 阅读全文
posted @ 2013-08-02 12:28 _雨 阅读(241) 评论(0) 推荐(0)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4630给的题解没看懂。。搜解题报告看 了N久 终于在cui大神的指点下 搞明白咋回事了将1-N中的每个数ai的倍数的位置p求出来 它们任意两个p组成的区间内约数至少为ai 在询问的区间L-R中如果存在这样的区间pi-pj那肯定存在相邻的 然后排好序 相邻的为一个区间l-r保存起来以r从小到大排序 将输入的询问区间进行离线处理 以R由小到大排序 对于每个区间插入r值比R小的区间 求值时以L为下界求到N 其实就是求到R 到R还快了500多ms。 1 #include 2 #include 3 #include . 阅读全文
posted @ 2013-07-31 19:18 _雨 阅读(188) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=3321刚一看题以为要建一颗树 看了下讨论说dfs这里dfs遍历时设的标号很好 一个low一个high 包含了以这一节点为根节点的子树结点的所有标号 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define N 100010 8 #define lowbit(x) (x&(-x)) 9 struct node10 {11 int u,v,next;12 }ed[N<<1];13 int head[N],t, 阅读全文
posted @ 2013-07-29 19:41 _雨 阅读(201) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=1195模版题 i写成k了 找了一个多小时没找出来。。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define N 1050 8 #define lowbit(x) (x&(-x)) 9 int n,c[N][N];10 void add(int i,int j,int da)11 {12 int k;13 while(i>t>>n;43 memset(c,0,sizeof(c));44 w... 阅读全文
posted @ 2013-07-29 16:17 _雨 阅读(226) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=2892记录每个区间端点的左连续及右连续 都是单点更新 用不着向下更新 还简单点找错找了N久 最后发现将s[w 2 #include 3 #include 4 #include 5 using namespace std; 6 #define N 50010 7 int lr[N>1;14 build(l,m,w>1;20 lr[w] = lr[w>1;36 if(p>1;49 if(p=p)58 return lr[w>n>>m)67 {68 build(1,n,1);... 阅读全文
posted @ 2013-07-29 14:33 _雨 阅读(260) 评论(0) 推荐(0)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4614线段树的各种操作 写的有点乱 求插入位置是以区间K值的方法求出的 向下更新 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 #define N 50010 7 int s[N>1; 18 build(l,m,w>1; 49 if(p=r) 57 { 58 if(d) 59 s[w] = r-l+1; 60 else 61 ... 阅读全文
posted @ 2013-07-28 15:12 _雨 阅读(165) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=2352二维逆序数 按一个数排序 转化为1维的 之前用树状数组写过 这次用线段树敲了下 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define N 32010 8 struct node 9 {10 int x, y;11 }st[N];12 int s[N>1;27 build(l,m,w>1;42 if(p=r)51 {52 return s[w];53 }54 ... 阅读全文
posted @ 2013-07-14 20:32 _雨 阅读(243) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=2482类似于上一篇 这题转化的比较巧妙 将一个点转化为一个矩形(x,y, x+w,y+h),扫描线入值为正 出值为负也就是一根线过去 每进入一个矩形 都更新线上的总值 取一个最大值 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define N 20010 8 #define LL long long 9 struct node 10 { 11 LL lx,rx,y,s; 12 node()... 阅读全文
posted @ 2013-07-14 19:47 _雨 阅读(249) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=1151http://www.cnblogs.com/kane0526/archive/2013/02/26/2934214.html这篇博客写的不错 主要是图画的不错求面积并 离散化后 通过添加矩形的x方向边 用线段树不断更新(要求的分割开的)矩形的长和宽 1 #include 2 #include 3 #include 4 #include 5 #define maxn 5050 6 using namespace std; 7 struct node 8 { 9 double lx,rx,y;10 int s;11 ... 阅读全文
posted @ 2013-07-14 19:22 _雨 阅读(177) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=2750之前做过类似的题 把一段的左连续最大、最小 右连续最大及最小及中间的连续更新出 就可以算出这段最大的连续和注意不能全部加上 加上一特判 如果最大和是全部数的和就减去这段最小的和 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define N 100010 8 struct node 9 {10 int va,lmax,rmin,lmin,rmax,smax,smin;11 }p[N>1;33 bui... 阅读全文
posted @ 2013-07-11 22:00 _雨 阅读(382) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=2886单点更新 初始位置都是1 如果这个人出去 位置变为0 利用线段树求区间k值 k值的计算如下如果这个数值是负的 那么下一个人的就是((k-1+p[id].d)%n+n)%n+1; 如果是正的 下一个人就是(k-1+p[id].d-1)%n+1; 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define N 500010 9 struct node10 {11 char s[12];12... 阅读全文
posted @ 2013-07-11 18:18 _雨 阅读(221) 评论(0) 推荐(0)