当前位置:文档之家› 树状数组系列题目总结

树状数组系列题目总结

树状数组系列题目总结
树状数组系列题目总结

树形DP之个人整理总结

树形DP 二叉苹果树(ural 1108) 题目意思: 有一棵苹果树,苹果树的是一棵二叉树,共N个节点,树节点编号为1~N,编号为1的节点为树根,边可理解为树的分枝,每个分支都长着若干个苹果,现在要要求减去若干个分支,保留M个分支,要求这M个分支的苹果数量最多。 输入: N M 接下来的N-1行是树的边,和该边的苹果数N and M (1 ≤ M < N; 1 < N ≤ 100) 输出: 剩余苹果的最大数量。 input 5 2 1 3 1 1 4 10 2 3 20 3 5 20 output 21 算法: 删除了某个分支,那么这个分支下的子分支也同时删除。 保留M个分支,也就是删除N-M-1个分支。剩余的最多苹果数=总苹果数-剪掉的苹果数。注意本题给的边并没有按照树根--树叶的形式来给,也没有按照树的顺序给出边。本来想一个节点对应一个分支长着的苹果数量,cost[v]就表示v这个节点的苹果数,可以这样做,但是在输入的时候,不知道这个苹果数量是那个节点的,因为不知道哪个是哪个的子结点。所以用了无向图和苹果数加到边上去。 我的解法中:这题的树状DP的整体思想个pku3345是一样的。 有一些不一样的地方要注意一下: 本程序其实不仅仅针对二叉树,可以是任意的树,删除任意个分支都有算。 #include #include #include using namespace std; #define MN 110 int f[2*MN],p[MN],tmp[MN];

int N,M; bool visit[MN]; struct NODE { int val; int cost; }; vectorG[MN]; inline int max(int a,int b) { return a>b?a:b; } inline int min(int a,int b) { return a

动态规划专题(六):树型动态规划

动态规划专题(六):树型动态规划 (重庆巴蜀中学黄新军) 信息学竞赛中通常会出现这样的问题:给一棵树,要求以最少的代价(或取得最大收益)完成给定的操作。有很多问题都是在树和最优性的基础上进行了扩充和加强,从而变成了棘手的问题。这类问题通常规模较大,枚举算法的效率无法胜任,贪心算法不能得到最优解,因此要用动态规划解决。 和一般动态规划问题一样,这类问题的解决要考虑如下三步: 1、确立状态:几乎所以的问题都要保存以某结点为根的子树的情况,但是要根据具体问题考虑是否要加维,加几维,如何加维。 2、状态转移:状态转移的变化比较多,要根据具体问题具体分析,这也是本文例题分析的重点。 3、算法实现: 由于模型建立在树上,即为树型动态规划。 【例题1】二叉苹果树 【问题描述】 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点),这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1。 我们用一根树枝两端连接的结点的编号来描述一根树枝的位置。下面是一颗有4个树枝的树: 现在这颗树枝条太多了,需要剪枝。但是一些树枝上长有苹果。给定需要保留的树枝数量,求出最多能留住多少苹果。 【文件输入】 第1行2个数,N和Q(1<=Q<=N,1

最新英语语言学树型图详细讲解

树形图详细讲解 1. Indicate the category of each word in the following sentences. a) The old lady suddenly left. Det A N Qual V b) The car stopped at the end of the road. Det N V P Det N P Det N c) The snow might have blocked the road. Det N Aux Aux V Det N d) He never appears quite mature. N Qual V Deg A 2. The following phrases include a head, a complement, and a specifier. Draw the appropriate tree structure for each. a) full of people AP A P N full of people b) a story about a sentimental girl NP NP PP Det N P NP Det A N a story about a sentimental girl c) often read detective stories VP Qual V NP A N often read detective stories

d) the argument against the proposals NP NP PP Det N P NP Det N the argument against the proposals e) move towards the window VP V PP P Det N move towards the window 3. Draw phrase structure trees for each of the following sentences. a) The jet landed. InflP(=S) NP Infl VP Det N Pst V The jet landed b) Mary became very ill. InflP(=S) NP Infl VP N Pst V AP Deg A Mary became very ill

最优二叉查找树_动态规划

最优二叉查找树 【源程序】 //本程序测试用例为课本例题 #include #define INF 1000000000 //将这两个二维数组定义为全局变量,从而可以避免在函数之间进行参数的传递double C[100][100]; int R[100][100]; doubleOptimalBST(double p[], int n) { inti, j, k, d; int mink; //注意这里min 和sum一定要定义成double类型,否则赋不上值!!doublemin,sum; for(i=1; i<=n; i++) { C[i][i-1]=0; C[i][i]=p[i-1]; R[i][i]=i; } C[n+1][n]=0; for(d=1; d

} return C[1][n]; } int main() { int n; double p[100]; printf("请输入字符个数:"); scanf("%d",&n); printf("\n"); printf("请输入每个字符的查找概率:"); for(inti=0; i

树状数组及其应用

树状数组及其应用 ( Binary Indexed Trees ) 一、什么是树状数组 【引例】 假设有一列数{A i}(1<=i<=n),支持如下两种操作: 1.将A k的值加D。(k,D是输入的数) 2.输出A s+A s+1+…+A t(s,t都是输入的数,s<=t) 分析一:线段树 建立一颗线段树(线段长度1~n)。一开始所有结点的count值等于0。 对于操作1,如果把A k的值加D,则把所有覆盖了A k的线段的count值加D。只有log2n 条线段会受到影响,因此时间复杂度是O(log2n)。 每条线段[x..y]的count值实际上就是A x+A x+1+…+A y的值。 对于操作2,实际上就是把[s..t]这条线段分解成为线段树中的结点线段,然后把所有的结点线段的count值相加。该操作(ADD操作)在上一讲线段树中已介绍。时间复杂度为O (log2n)。 分析二:树状数组 树状数组是一种特殊的数据结构,这种数据结构的时空复杂度和线段树相似,但是它的系数要小得多。 增加数组C,其中C[i]=a[i-2^k+1]+……+a[i](k为i在二进制形式下末尾0的个数)。由c数组的定义可以得出:

为了对树状数组有个形象的认识,我们先看下面这张图。 如图所示,红色矩形表示的数组C[]就是树状数组。我们也不难发现,这个k就是该节点在树中的高度,因而这个树的高度不会超过logn。 【操作1】修改A[i]的值。可以从C[i]往根节点一路上溯,调整这条路上的所有C[]即可,这个操作的复杂度在最坏情况下就是树的高度即O(logn)。 定理1:若a[k]所牵动的序列为C[p1],C[p2]……C[p m],则p1=k,而p i+1=p i+2li (l i为p i在二进制中末尾0的个数)。 例如a[1]……a[8]中,a[3] 添加x; p1=k=3 p2=3+20=4 p3=4+22=8 p4=8+23=16>8 由此得出,c[3]、c[4]、c[8]亦应该添加x。 定理的证明如下: 【引理】 若a[k]所牵动的序列为C[p1],C[p2] ……C[p m],且p1

数据结构总结

转载自South_wind的专栏 常见的数据结构运用总结 考虑到Obsidian三个成员的擅长领域,这段时间都在做杂题,算是学习各种算法吧,趁现在休息的时间,而且大家马上要备战今年的比赛了,写写自己专攻方面的一些心得吧 扯开线段树、平衡树这些中高级的东西,先说说基础的数据结构 栈 算是代码量最小的数据结构?出栈进栈都只有一句话而已 常见用途: 消去一个序列中的相同元素(做法大家应该都知道了吧,见过很多次了) 维护一个单调的序列(所谓的单调栈,dp的决策单调?) 表达式求值(经典的栈运用,如果使用的很熟悉的话,可以处理一元、二元运算,不过最近没见过类似的题目了) 用于辅助其他算法(计算几何中的求凸包) 队列 队列应该还是很常见的数据结构了,如果专攻图论的话,spfa应该是写烂了的 这里说到的队列,是狭义的普通的队列和循环队列,不包括后面讲的一些变形 注意循环队列的写法,尽量不要使用取模运算,不然的话,遇到不厚道的出题者,可以把取模的循环队列卡到死 常见用途: 主要用于辅助其他算法,比如说spfa,bfs等(建议习惯用stl的孩子手写queue,毕竟就几行代码而已,偷懒会付出代价的。。。) 双端队列 如果写dp写的多的话,这个东西应该还是算是比较基础的东西了,双端队列多用于维护一个满足单调性的队列 还是建议手写,stl的deque使用块状链表写的,那东西的复杂度是O(Nsqrt(N))的,不要被迷惑了。 常见用途: dp的单调性优化,包括单调队列优化和斜率优化,都要用到这个结构 计算几何中的算法优化,比如半平面交 树的分治问题中利用单调队列减少转移复杂度 链表Dancing Links 写图论的不要告诉我不会写这货,链表可以写单双向,循环非循环的,高级点儿的可以考虑十字链表,麻花链表 不过链表可以说是树形结构的基础,如果这个掌握的不好,那么树形结构写起来就会很纠结 链表的优势在于可以O(1)的插入删除,如果要求插入的位置只是在序列的两端的话,这个数据结构是最方便的了(无视双端队列) hash表就是用链表实现的,熟悉hash的同学可以试试看怎么使你的hash效率提高

树状数组

树状数组 武钢三中 吴豪【引言】 在解题过程中,我们有时需要维护一个数组的前缀和S[i]=A[1]+A[2]+...+A[i]。但是不难发现,如果我们修改了任意一个A[i],S[i]、S[i+1]...S[n]都会发生变化。可以说,每次修改A[i]后,调整前缀和S[]在最坏情况下会需要O(n)的时间。当n非常大时,程序会运行得非常缓慢。因此,这里我们引入“树状数组”,它的修改与求和都是O(logn)的,效率非常高。 【理论】 为了对树状数组有个形 象的认识,我们先看下面这张图。 如图所示,红色矩形表示的数组C[]就是树状数组。 这里,C[i]表示A[i-2^k+1]到A[i]的和,而k则是i在二进制时末尾0的个数,或者说是i用 2的幂方和表示时的最小指数。( 当然,利用位运算,我们可以直接计算出2^k=i&(i^(i-1)) )同时,我们也不难发现,这个k就是该节点在树中的高度,因而这个树的高度不会超过logn。所以,当我们修 改A[i]的值时,可以从C[i]往根节点一路上溯,调整这条路上的所有C[]即可,这个操作的复杂度在最坏情况下就是树的高度即O(logn)。另外,对于求数列的前n项和,只需找到n以前的所有最大子树,把其根节点的C加起来即可。不难发现,这些子树的数目是n在二进制时1的个数,或者说是把n展开 成2的幂方和时的项数,因此,求和操作的复杂度也是O(logn)。 接着,我们考察这两种操作下标变化的规律: 首先看修改操作: 已知下标i,求其父节点的下标。我们可以考虑对树从逻辑上转化:

如图,我们将子树向右对称翻折,虚拟出一些空白结点(图中白色),将原树转化成完全二叉树。 有图可知,对于节点i,其父节点的下标与翻折出的空白节点下标相同。 因而父节点下标 p=i+2^k (2^k是i用2的幂方和展开式中的最小幂,即i为根节点子树的规模)即 p = i + i&(i^(i-1)) 。 接着对于求和操作: 因为每棵子树覆盖的范围都是2的幂,所以我们要求子树i的前一棵树,只需让i减去2的最小幂即可。即 p = i - i&(i^(i-1)) 。 至此,我们已经比较详细的分析了树状数组的复杂度和原理。 在最后,我们将给出一些树状数组的实现代码,希望读者能够仔细体会其中的细节。 【代码】 求最小幂2^k: in t L o wb i t(in t t) { retur n t & ( t ^ ( t - 1 ) ); } 求前n项和: in t S um(in t e n d) { in t sum = 0; wh il e(e n d> 0) {

动态规划状态转移方程

1.资源问题1 -----机器分配问题 F[I,j]:=max(f[i-1,k]+w[i,j-k]) 2.资源问题2 ------01背包问题 F[I,j]:=max(f[i-1,j-v[i]]+w[i],f[i-1,j]); 3.线性动态规划1 -----朴素最长非降子序列 F[i]:=max{f[j]+1} 4.剖分问题1 -----石子合并 F[i,j]:=min(f[i,k]+f[k+1,j]+sum[i,j]); 5.剖分问题2 -----多边形剖分 F[I,j]:=min(f[i,k]+f[k,j]+a[k]*a[j]*a[i]); 6.剖分问题3 ------乘积最大 f[i,j]:=max(f[k,j-1]*mult[k,i]); 7.资源问题3 -----系统可靠性(完全背包) F[i,j]:=max{f[i-1,j-c[i]*k]*P[I,x]} 8.贪心的动态规划1 -----快餐问题 F[i,j,k]:=max{f[i-1,j',k']+(T[i]-(j-j')*p1-(k-k')*p2) div p3} 9.贪心的动态规划2 -----过河 f[i]=min{{f(i-k)} (not stone[i]) {f(i-k)}+1} (stone[i]); +贪心压缩状态 10.剖分问题4 -----多边形-讨论的动态规划 F[i,j]:=max{正正 f[I,k]*f[k+1,j]; 负负 g[I,k]*f[k+1,j]; 正负 g[I,k]*f[k+1,j]; 负正 f[I,k]*g[k+1,j];} g为min 11.树型动态规划1 -----加分二叉树 (从两侧到根结点模型)

1701 【树状数组】数星星(POJ2352 star) 1702 【树状数组】矩阵(POJ 2155)

【树状数组】数星星(POJ2352 star) Time Limit:1000MS Memory Limit:65536K Total Submit:23 Accepted:16 Description 天文学家经常观察星象图。星象图中用平面上的点来表示一颗星星,每一颗星星都有一个笛卡尔坐标。设定星星的等级为其左下角星星的总数。天文学家们想知道星星等级的分布情况。 比如上图,5号星星的等级为3(其左下角有编号为1、2、4的星星共三颗)。2号星星和4号星星的等级为1。在上图中只有一颗星星等级为0,两颗星星等级为1,一颗星星等级为2,一颗星星等级为3。 给定一个星象图,请你写一个程序计算各个等级的星星数目。 Input 输入的第一行包含星星的总数N (1<=N<=15000)。接下来N行,描述星星的坐标(X,Y)(X和Y用空格分开,0<=X,Y<=32000)。星象图中的每个点处最多只有一颗星星。所有星星按Y坐标升序排列。Y坐标相等的星星按X坐标升序排列。 Output 输出包含N行,每行一个整数。第一行包含等级0的星星数目,第二行包含等级1的星星数目,依此类推,最后一行包含等级为N-1的星星数目。 Sample Input 5

1 1 5 1 7 1 3 3 5 5 Sample Output 1 2 1 1

?const maxn=60000; ?var i,n,x,y,k:longint; ?a:array[0..15000] of longint; ?c,stars:array[0..60000] of longint; ?procedure add(p,d:longint); ?begin ? while p<=maxn do begin ? c[p]:=c[p]+d; ? p:=p+p and (-p); ? end; ?end; ?function sum(p:longint):longint; ?var res:longint; ?begin ? res:=0; ? while p>0 do begin ? res:=res+c[p]; p:=p-p and (-p); ? end; ? exit(res); ?end; ?begin ?readln(n); ?for i:=1 to n do begin ? readln(x,y); ? add(x+1,1); ? k:=sum(x+1)-1; ? stars[k]:=stars[k]+1; ?end; ?for i:=0 to n-1 do writeln(stars[i]); ?end.

华附高一入学测试说明

高一入学测试说明 一、命题指导思想 符合选拔性测试的规律和要求,反映各测试科目初中课程标准的整体要求,部分内容可 超出初中各科教学大纲,以有利于选拔具有学习潜能和创新精神的合格新生。 试题以能力测试为主导,在考查考生对基础知识、基本技能和方法掌握程度的同时,注 重能力和科学素养的考查,注重考查运用所学知识分析、解决具体问题的能力;强调知识之间的内在联系;注重理论联系实际。全面落实对“知识与技能”、“过程与方法”、“情感态度与 价值观”三维目标的考查。 二、测试范围内容和测试能力要求 语文测试说明 主题内容 测试范围 依据初中、高中课程标准,根据广东奥林匹克学校对高一奥班新生 文化素质的要求,结合奥校初中、高中语文教学实际,确定语文科测 试内容。 考查内容主要分为“语言文字运用”、“古代诗文阅读”、“现代 文阅读”和“写作”四大板块。 一、语言文字运用 正确、熟练、有效地运用语言文字。 1.识记 (1)识记现代汉语普通话常用字的字音 (2)识记并正确书写现代常用规范汉字 2.表达应用 (1) 正确使用词语(包括熟语) (2) 辨析并修改病句 (3) 扩展语句,压缩语段 (4) 正确运用常见的修辞手法 (5) 语言表达简明、连贯、得体、准确 二、古代诗文阅读 阅读浅易的古代诗文。 1.识记常见的名句名篇。 2.理解 (1)理解常见的文言实词和虚词 (2)翻译文中的句子 3.分析综合 (1)筛选文中的信息 (2)归纳内容要点,概括中心意思 三、现代文阅读 (一)文学类文本阅读 阅读鉴赏中外文学作品。 2 / 7 1、整体把握文学作品的内容、情感、形象

2、理清作者思路和作品线索 3、揣摩作品中的精彩细节 4、品味语言,领悟内涵 5、鉴赏作品的写作技巧和艺术特色 6、探索作品蕴涵的民族心理和人文精神 (二)实用类文本阅读 1、整体把握实用类文本的主要内容 2、阅读科技、社科、新闻作品,筛选信息,概括要点 3、运用文中知识对相关实际问题进行分析推断 4、阅读论述类文章,理解观点与材料之间的联系 5、联系实际,对文中的观点作出自己的判断 6、体会和分析实用类文本的语言特点 四、写作 能熟练写作记叙文,会写简单的论述类、实用类等文章。 能力要求考查考生识记、理解、分析综合、鉴赏评价、表达应用和探究六种能力,其中阅读理解、分析归纳和写作能力是考查的重点。 测试题型1.选择题约25% 2.非选择题约75% 数学I 测试说明 主题内容 测试范围 命题范围为国家教育部2001 年颁布的《全日制义务教育数学课程标 准(实验稿)》、《义务教育课程标准实验教科书——数学(七、八、 九年级)》(人民教育出版社)所规定的内容。主要包括: (1)实数及其运算 (2)整式、分式、二次根式的概念与运算 (3)一元一次方程、一元二次方程、方程组 (4)一元一次不等式、一元一次不等式组 (5)一次函数、反比例函数、二次函数的性质及其图象 (6)三角形、四边形、多边形、圆及相应图形的性质 (7)平移、对称、旋转、相似等图形变换的性质 (8)概率、统计中的概念与运算 3 / 7 (9)以上内容在实际问题中的应用 能力要求 主要考查五种数学能力和四种思想方法,即: (1)空间想象能力、抽象概括能力、推理论证能力、运算求解能力、数 据处理能力 (2)等价转换思想、函数与方程思想、数形结合思想、分类讨论思想 测试题型 (1)选择题,共6 道 (2)填空题,共6 道 (3)解答题,共4 道

动态规划基本原理

动态规划基本原理 近年来,涉及动态规划的各种竞赛题越来越多,每一年的NOI几乎都至少有一道题目需要用动态规划的方法来解决;而竞赛对选手运用动态规划知识的要求也越来越高,已经不再停留于简单的递推和建模上了。 要了解动态规划的概念,首先要知道什么是多阶段决策问题。 一、多阶段决策问题 如果一类活动过程可以分为若干个互相联系的阶段,在每一个阶段都需作出决策(采取措施),一个阶段的决策确定以后,常常影响到下一个阶段的决策,从而就完全确定了一个过程的活动路线,则称它为多阶段决策问题。 各个阶段的决策构成一个决策序列,称为一个策略。每一个阶段都有若干个决策可供选择,因而就有许多策略供我们选取,对应于一个策略可以确定活动的效果,这个效果可以用数量来确定。策略不同,效果也不同,多阶段决策问题,就是要在可以选择的那些策略中间,选取一个最优策略,使在预定的标准下达到最好的效果. 让我们先来看下面的例子:如图所示的是一个带权有向的多段图,要求从A到D的最短 图4-1 带权有向多段图 路径的长度(下面简称最短距离)。 我们可以搜索,枚举图中的每条路径,但当图的规模大起来时,搜索的效率显然不可能尽人意。让我们来试用动态规划的思路分析这道题:从图中可以看到,A点要到达D点必然要经过B1和B2中的一个,所以A到D的最短距离必然等于B1到D的最短距离加上5,或是B2到D的最短距离加上2。同样的,B1到D的最短距离必然等于C1到D的最短距离加上3或是C2到D的最短距离加上2,……。 我们设G[i]为点i到点D的距离,显然G[C1]=4,G[C2]=3,G[C3]=5,根据上面的分析,

有: G[B1]=min{G[C1]+3,G[C2]+2}=5, G[B2]=min{G[C2]+7,G[C3]+4}=9, 再就有G[A]=min{G[B1]+5,G[B2]+2}=10, 所以A到D的最短距离是10,最短路径是A→B1→C2→D。 二、动态规划的术语 1.阶段 把所给求解问题的过程恰当地分成若干个相互联系的阶段,以便于求解,过程不同,阶段数就可能不同.描述阶段的变量称为阶段变量。在多数情况下,阶段变量是离散的,用k 表示。此外,也有阶段变量是连续的情形。如果过程可以在任何时刻作出决策,且在任意两个不同的时刻之间允许有无穷多个决策时,阶段变量就是连续的。 在前面的例子中,第一个阶段就是点A,而第二个阶段就是点A到点B,第三个阶段是点B到点C,而第四个阶段是点C到点D。 2.状态 状态表示每个阶段开始面临的自然状况或客观条件,它不以人们的主观意志为转移,也称为不可控因素。在上面的例子中状态就是某阶段的出发位置,它既是该阶段某路的起点,同时又是前一阶段某支路的终点。 在前面的例子中,第一个阶段有一个状态即A,而第二个阶段有两个状态B1和B2,第三个阶段是三个状态C1,C2和C3,而第四个阶段又是一个状态D。 过程的状态通常可以用一个或”一组数”来描述,称为状态变量。一般,状态是离散的,但有时为了方便也将状态取成连续的。当然,在现实生活中,由于变量形式的限制,所有的状态都是离散的,但从分析的观点,有时将状态作为连续的处理将会有很大的好处。此外,状态可以有多个分量(多维情形),因而用向量来代表;而且在每个阶段的状态维数可以不同。 当过程按所有可能不同的方式发展时,过程各段的状态变量将在某一确定的范围内取值。状态变量取值的集合称为状态集合。 3.无后效性 我们要求状态具有下面的性质:如果给定某一阶段的状态,则在这一阶段以后过程的发

树状数组求区间和的一些常见模型

树状数组求区间和的一些常见模型 树状数组在区间求和问题上有大用,其三种复杂度都比线段树要低很多……有关区间求和的问题主要有以下三个模型(以下设A[1..N]为一个长为N的序列,初始值为全0): (1)“改点求段”型,即对于序列A有以下操作: 【1】修改操作:将A[x]的值加上c; 【2】求和操作:求此时A[l..r]的和。 这是最容易的模型,不需要任何辅助数组。树状数组中从x开始不断减lowbit(x)(即x&(-x))可以得到整个[1..x]的和,而从x开始不断加lowbit(x)则可以得到x 的所有前趋。代码: void ADD(int x, int c) { for (int i=x; i<=n; i+=i&(-i)) a[i] += c; } int SUM(int x) { int s = 0; for (int i=x; i>0; i-=i&(-i)) s += a[i]; return s; } 操作【1】:ADD(x, c); 操作【2】:SUM(r)-SUM(l-1)。 (2)“改段求点”型,即对于序列A有以下操作: 【1】修改操作:将A[l..r]之间的全部元素值加上c; 【2】求和操作:求此时A[x]的值。 这个模型中需要设置一个辅助数组B:B[i]表示A[1..i]到目前为止共被整体加了多少(或者可以说成,到目前为止的所有ADD(i, c)操作中c的总和)。 则可以发现,对于之前的所有ADD(x, c)操作,当且仅当x>=i时,该操作会对A[i]

的值造成影响(将A[i]加上c),又由于初始A[i]=0,所以有A[i] = B[i..N]之和!而ADD(i, c)(将A[1..i]整体加上c),将B[i]加上c即可——只要对B数组进行操作就行了。 这样就把该模型转化成了“改点求段”型,只是有一点不同的是,SUM(x)不是求B[1..x]的和而是求B[x..N]的和,此时只需把ADD和SUM中的增减次序对调即可(模型1中是ADD加SUM减,这里是ADD减SUM加)。代码: void ADD(int x, int c) { for (int i=x; i>0; i-=i&(-i)) b[i] += c; } int SUM(int x) { int s = 0; for (int i=x; i<=n; i+=i&(-i)) s += b[i]; return s; } 操作【1】:ADD(l-1, -c); ADD(r, c); 操作【2】:SUM(x)。 (3)“改段求段”型,即对于序列A有以下操作: 【1】修改操作:将A[l..r]之间的全部元素值加上c; 【2】求和操作:求此时A[l..r]的和。 这是最复杂的模型,需要两个辅助数组:B[i]表示A[1..i]到目前为止共被整体加了多少(和模型2中的一样),C[i]表示A[1..i]到目前为止共被整体加了多少的总和(或者说,C[i]=B[i]*i)。 对于ADD(x, c),只要将B[x]加上c,同时C[x]加上c*x即可(根据C[x]和B[x]间的关系可得); 而ADD(x, c)操作是这样影响A[1..i]的和的:若x=i)会将A[1..i]的和加上i*c。也就是,A[1..i]之和= B[i..N]之和* i + C[1..i-1]之和。 这样对于B和C两个数组而言就变成了“改点求段”(不过B是求后缀和而C是求前缀和)。 另外,该模型中需要特别注意越界问题,即x=0时不能执行SUM_B操作和ADD_C 操作!代码: void ADD_B(int x, int c) {

树形动规题型分析

树形动规题型分析北京大学李煜东

Ural1039 没有上司的舞会 题目大意:Ural大学有N个职员,编号为1~N。他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。每个职员有一个快乐指数。现在有个周年庆宴会,要求与会职员的快乐指数最大。但是,没有职员愿和直接上司一起与会。 F[i][0]表示以i为根的子树,i不参加舞会时的最大快乐指数。 F i0= s∈Son i Max(F s0,F[s][1]) F[i][1]表示以i为根的子树,i参加舞会时的最大快乐指数。 F i1=Happy i+ s∈Son i F s0 通过DFS求出F数组,目标就是Max(F[1][0],F[1][1])。

Nescafé8 创世纪 题目大意:上帝手中有着N(N<=1000000)种被称作“世界元素”的东西,现在他要把它们中的一部分投放到一个新的空间中去建造世界。每种世界元素都可以限制另外一种世界元素,上帝希望所有被投放的世界元素都有至少一个没有被投放的世界元素能够限制它。 上帝希望知道他最多可以投放多少种世界元素? 每个世界元素的出度都是1(只能限制另外一种),所以题目中的限制条件构成内向树森林。 如果题目中的限制条件构成的图是一棵树,那么DP方法和上一题类似:F[i][0]表示i没有被投放时,以i为根的子树里最多可以投放多少种世界元素。 F[i][1]表示i被投放时,以i为根的子树里最多可以投放多少种世界元素。 F i0=s∈Son i Max(F s0,F[s][1]) F i1=Max F s0+s′∈Son i,s′≠s Max F s′0,F s′1|s∈Son i 如果是内向树,那么任意枚举基环上的一条边,先把它断开(不使用这个限制条件),在剩余的树上进行树状动规;然后再强制使用这个限制条件,再进行一次树状动规。

线段树

线段树 目录 定义 基本结构 实现代码 树状数组 编辑本段定义 区间在[1,5]内的线段树 线段树又称区间树,是一种对动态集合进行维护的二叉搜索树,该集合中的每个元素 x 都包含一个区间 Interval [ x ]。 线段树支持下列操作: Insert(t,x):将包含区间 int 的元素 x 插入到树中; Delete(t,x):从线段树 t 中删除元素 x; Search(t,i):返回一个指向树 t 中元素 x 的指针。 编辑本段基本结构 线段树是建立在线段的基础上,每个结点都代表了一条线段[a , b]。长度为1的线段称为元线段。非元线段都有两个子结点,左结点代表的线段为[a , (a + b ) / 2],右结点代表的线段为[( a + b ) / 2 , b]。 右图就是一棵长度范围为[1 , 5]的线段树。 长度范围为[1 , L] 的一棵线段树的深度为log ( L - 1 ) + 1。这个显然,而且存储一棵线段树的空间复杂度为O(L)。 线段树支持最基本的操作为插入和删除一条线段。下面以插入为例,详细叙述,删除类似。 将一条线段[a , b] 插入到代表线段[l , r]的结点p中,如果p不是元线段,那么令mid=(l+r)/2。如果bmid,那么将线段[a , b] 也插入到p的右儿子结点中。

插入(删除)操作的时间复杂度为O (Log N)。 上面的都是些基本的线段树结构,但只有这些并不能做什么,就好比一个程序有输入没输出,根本没有任何用处。 最简单的应用就是记录线段有否被覆盖,并随时查询当前被覆盖线段的总长度。那么此时可以在结点结构中加入一个变量int count;代表当前结点代表的子树中被覆盖的线段长度和。这样就要在插入(删除)当中维护这个count值,于是当前的覆盖总值就是根节点的count值了。 另外也可以将count换成bool cover;支持查找一个结点或线段是否被覆盖。[1] 相信对算法设计或者数据结构有一定了解的人对线段树都不会太陌生。它是能够在log(MaxLen)时间内完成线段的添加、删除、查询等操作。但一般的实现都有点复杂而线段树应用中有一种是专门针对点的。(点树?)它的实现却非常简单。 这种数据结构有什么用?我们先来考虑一下下面的需求(全部要求在LogN 时间内完成):如何知道一个点在一个点集里的大小“排名”?很简单,开一个点数组,排个序,再二分查找就行了;如何在一个点集内动态增删点?也很简单,弄个平衡树就行了(本来平衡树比线段树复杂得多,但自从世界上有了STL set 这么个好东东,就……^_^)那如果我既要动态增删点,也要随时查询到一个点的排名呢?那对不起,可能就要出动到我们的“点树”了。 其实现原理很简单:每当增加(或删除)一个大小为X的点时,就在树上添加(或删除)一条(X,MaxLen)的线段(不含端点),当要查询一个点的排名时,只要看看其上有多少条线段就可以了。针对这一需求,这里有个非常简单的实现(见以下代码,十多行,够短了吧?)其中clear()用于清空点集;add()用于添加一个点;cntLs()返回小于n的点的个数,也就是n的升序排名,类似地cntGt 是降序排名。 这个点树有什么用呢?其中一个应用时在O(NlogN)时间内求出一个排列的逆序数(https://www.doczj.com/doc/1410577377.html,/show_problem.php?pid=1484,你有更好的算法吗?欢迎交流)方法是每读到一个数x,就让逆序数+=cntGt(x);然后再 add(x)。 这个实现还可以进行一些扩展。比如删除del(int n),只要把add(int n)中的++size换成--size,把a[i/2]++改成a[i/2]--即可。另外还可以通过二分查找功能在O(logN)时间内查到排名第n的点的大小。应该也可以三四行内搞定。 补充:杨弋同学在2008年信息学奥赛冬令营上新发明了一种线段树的省空间堆式存储法,具体方法可以见08年冬令营课件. 编辑本段实现代码 template < int N > // 表示可用区间为[0,N),其中N必须是2的幂数; class PointTree { int a[ 2 * N]; int size; void clear() { memset( this , 0 , sizeof ( * this ));} void add( int n) {

Vijos 1448校门外的树(树状数组与线段树)

Vijos 1448校门外的树 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的…… 如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作: K=1,读入l,r表示在l~r之间种上的一种树 K=2,读入l,r表示询问l~r之间能见到多少种树 (l,r>0) 输入第一行n,m表示道路总长为n,共有m个操作 接下来m行为m个操作 输出对于每个k=2输出一个答案 样例输入 5 4 1 1 3 2 2 5 1 2 4 2 3 5 样例输出 1 2 括号序列+树状数组 什么是括号序列下面简单介绍一下(感谢tiger教会我) 假设有一个长度是20的数轴,现在我们要在2 15之间种上一种树,那么我们可以在2处添加一个‘(’,在15的地方添加一个‘)’,这就是简单的括号序列。 如果要统计某个区间树的种类,例如3 10,我们只需要统计10之前(包括10)有多少个‘(’,统计3之前有多少个‘)’,(不包括3)。 这样光说可能很难理解,下面给一个实例。 左括号和右括号表示的是在这些区间内种上了树。(日,感觉有点像在画大便)

假设这时候需要统计的是 5 10之间有多少种树,那么,只要在10之前种的树都是有效的(这时候先不管5的限制),也就是统计左括号的个数,一共是6个,下面加上5个限制,也就是说,在5之前,我们统计一下有多少右括号,也就是能与左括号匹配掉的括号有多少个?换句话说,就是有多少种树被限制了(自己意会下把,实在是用文字说不出来); 把程序也拿出来晒晒把(脑残的vijos,用writeln6个点超时,用write过了,还9ms) program vijos; var c1,c2:array[0..50000]of longint; n,m:longint; function lowbit(x:longint):longint; begin lowbit:=x and (x xor (x-1)); end; procedure addl(i:longint); begin while i<=n do begin inc(c1[i]); inc(i,lowbit(i)); end; end; procedure addr(i:longint); begin while i<=n do begin inc(c2[i]); inc(i,lowbit(i)); end; end; function findl(i:longint):longint; begin findl:=0; while i>0 do

语言学树形图课后问题详解

文档 树形图详细讲解 网上的相对理想的树形图答案,注意正两点: 1.短语和中心词在一竖线上 2.含有形容词修饰语的名词短语的画法 NP Det N A N a little boy 1. Indicate the category of each word in the following sentences. a)T he old lady suddenly left. Det A N Qual V b)The car stopped at the end of the road. Det N V P Det N P Det N c)T he snow might have blocked the road. Det N Aux Aux V Det N d)H e never appears quite mature. N Qual V Deg A 2.T he following phrases include a head, a complement, and a specifier. Draw the appropriate tree structure for each. a) full of people AP A P N

文档full of people b)a story about a sentimental girl NP NP PP Det N P NP Det A N a story about a sentimental girl c)o ften read detective stories VP Qual V NP A N often read detective stories

语言学树形图课后问题详细讲解

树形图详细讲解 网上的相对理想的树形图答案,注意正两 点: 1. 短语和中心词在一竖线上 2. 含有形容词修饰语的名词短语的画法 NP Det N A N a little boy 1. Indicate the category of each word in the following sentences. a) The old lady suddenly left. Det A N Qual V b) The car stopped at the end of the road. Det N V P Det N P Det N c) The snow might have blocked the road.

Det N Aux Aux V Det N d) He never appears quite mature. N Qual V Deg A 2. The following phrases include a head, a complement, and a specifier. Draw the appropriate tree structure for each. a) full of people AP A P N full of people b) a story about a sentimental girl NP NP PP

Det N P NP Det A N a story about a sentimental girl c) often read detective stories VP Qual V NP A N often read detective stories

相关主题
文本预览
相关文档 最新文档