随笔分类 -  线段树&树状数组

摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4288题意:给出一个有序集合,3种操作。插入一个数,删除一个数,都保证序列有序。以及求和 其中求和是将下标%5==3的所有数求和;题解: 线段树 + 离散化 + 离线处理一开始也是想的 线段树 ,但是 这个和以前的 做过的 一个线段树 不同的 是 ,如果 我们 删除 一个 元素后 ,那么 他的 下标 将会 改变 ,比赛是 不知 如何下手 。。。。。同样 是 用 5棵线段树 维护 ,s[0]表示 %5 == 1 的 下标,其他 依次类推 cnt,记录 子树的 元素个数。想要得到该区间内所有模5等3所有元素的和. 阅读全文
posted @ 2012-09-18 21:49 Szz 阅读(358) 评论(0) 推荐(0) 编辑
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4391题意:刷墙, 以开始 有 n个节点,每个节点有一种颜色 ,m 次询问m次 输入 a,l,r,z 如果 a=1 将 l到 r 刷为 z 颜色,如果 a=2 询问 l 到 r 有 多少个 和 z 相同的 节点官方题解是: 分段哈希,自己一开始想写 一下 ,单写着写着 就 觉得很麻烦 ,各中判断条件。。。。。后来改为 线段树 优化了下 ,就是加了 个 mi mx 判断 查询的颜色 是否在这里面。。。。。1#include<cstdio>2#include<cstring>3#inclu 阅读全文
posted @ 2012-08-24 17:43 Szz 阅读(439) 评论(1) 推荐(0) 编辑
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4366题意:给你 n个点。他们有 上下级关系,一个点只有一个上级,一个上级 可以有多个下级,每个点有两个属性,能力值 、忠诚度(每个节点的忠诚度不同),求我们要删除 一个节点, 则我们 需从 其下级中选出 一个节点,其能力值 比该节点 要高,且 忠诚度是(比其能力高的下级节点中的)最高题解:首先将树状结构,转化为 线状结构, 可以遍历一遍将树上每个点标记为一维区间上的某个点,且在同一棵子树内的点是连续的一段。然后,将所有点按能力从大到小排序,能力相同的编号小的排在前面,然后扫描一遍,扫描时维护一颗线段树,(. 阅读全文
posted @ 2012-08-17 08:47 Szz 阅读(477) 评论(2) 推荐(0) 编辑
摘要:1 /* 2 题意 : 3 改变矩阵中元素值 ,求子矩阵的和 4 二维树状数组, 5 */ 6 7 #include<stdio.h> 8 #define N 1050 9 int s;10 int map[N][N];11 int lowbit(int x)12 {13 return x&(-x);14 }15 void add(int x,int y,int d)16 {17 int i=x;18 int j=y;19 while(i<=s)20 {21 j=y;22 while(j<=s)23 ... 阅读全文
posted @ 2012-04-20 18:57 Szz 阅读(163) 评论(0) 推荐(0) 编辑
摘要:1 #include<stdio.h> 2 #include<string.h> 3 #define N 600000 4 int n; 5 int a[N],c[N]; 6 int lowbit(int x) 7 { 8 return x&(-x); 9 }10 int sum(int k)11 {12 int ans=0;13 while(k>0)14 {15 ans+=c[k];16 k=k-lowbit(k);17 }18 return ans;19 }20 int add(int pos ,int nu... 阅读全文
posted @ 2012-04-20 17:04 Szz 阅读(185) 评论(0) 推荐(0) 编辑
摘要:1 概述 2 3 树状数组是一个查询和修改复杂度都为log(n)的数据结构,假设数组a[1..n], 用lowbit函数维护了一个树的结构那么查询a[1]+...+a[n]的时间是log级别的,而且是一个在线的数据结构, 4 支持随时修改某个元素的值,复杂度也为log级别。 5 来观察这个图: 6 令这棵树的结点编号为C1,C2...Cn。令每个结点的值为这棵树的值的总和,那么容易发现: 7 C1 = A1 8 C2 = A1 + A2 9 C3 = A310 C4 = A1 + A2 + A3 + A411 C5 = A512 C6 = A5 +... 阅读全文
posted @ 2012-04-20 16:57 Szz 阅读(385) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=2750/*问题描述:给定一个环形序列,进行在线操作,每次修改一个元素,输出环上的最大连续子列的和,但不能是完全序列。算法:把环从一个地方,切断拉成一条直线,用线段树记录当前区间的非空最大子列和当前区间的非空最小子列。动态规划解决过静态的序列最大连续子序列和问题,时间复杂度可以达到 n(环形序列可能复杂度更高)。但是这里涉及到动态更新,更新频度很大,如果计算子序列和复杂度仍然是n,就会非常耗时。如果环上的数都是正整数,答案是:环上数的总和-根结点的非空最小子列;否则,答案是:max{根结点的非空最大子列, 环上数的总和-根结点的非空最小子列} 阅读全文
posted @ 2012-04-19 21:40 Szz 阅读(428) 评论(0) 推荐(0) 编辑
摘要:/*http://poj.org/problem?id=2828这道线段树的题竟然弄了两天,太菜了,后来在队友的讲解下才终于恍然大悟这道题呢,就是插队,但如果从前往后处理的话,一般方法,每插一个,移动后面的元素,移动位置,这样会超时,所以 用另一种方法,就是从后往前找,用线段树查找要插入的位置,(这就是线段树的魅力);每一个节点记录,l-----r存在几个空位,运用插空的方法,每一次查找,应该插入的第pos[i]空位;如一开始 1 2 3 4 为全为空,当插入一个 元素到 1号位置 那么 原来的2好空位变为了1好,3变为了24->3*/#include<stdio.h>#de 阅读全文
posted @ 2012-04-16 20:56 Szz 阅读(319) 评论(0) 推荐(0) 编辑
摘要:/* 离散化+线段树 由于 数据的输入最大是 10000000 ,直接用开数组肯点会超,所以要将起离散话, 首先 ,我们存储输入的边,将其离散化,后面的就和一般的线段树一样可。 */#include<stdio.h>#include<stdlib.h>#define N 10040struct node{ int l; int r;}p[N*2];struct color{ int l; int r; int c;}q[N*8];int cmp ( const void *a , const void *b ){return *(int *)a - *(in... 阅读全文
posted @ 2012-04-13 20:25 Szz 阅读(129) 评论(0) 推荐(0) 编辑
摘要:/*线段树染色,经典题,在这道题中学到了,只改变段,而没有下放到点,当下一次的改变,须向下进行是,则要将父节点的颜色下方到子节点 vis[]用来标记 ,避免重复计算*/#include<stdio.h>#include<string.h>#define N 100010struct node{ int b; int e; int c; }p[N*4];int sum,vis[N];void build(int x,int l,int r){ p[x].c=1; p[x].b=l; p[x].e=r; p[x].nu... 阅读全文
posted @ 2012-04-12 21:36 Szz 阅读(161) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示