随笔分类 - 线段树,树状数组
hdu 4339 Query
摘要:题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4339线段树或者 树状数组+二分记录两个字符串在该区间内有多少个字符相匹配。线段树:View Code 1 # include<stdio.h> 2 # include<string.h> 3 # include<stdlib.h> 4 # define N 1000005 5 char s1[N],s2[N]; 6 struct node{ 7 int l,r; 8 int num; 9 }tree[4*N]; 10 void bulid(int l,int
阅读全文
划分树
摘要:最近几天状态不佳,没事的时候总想看下奥运会。。划分树看几天了,今天终于看完了。划分树主要是用来求 在一个区间[l,r]中第k大的数。以及小于当前数的和。首先看一道题目:http://acm.hdu.edu.cn/showproblem.php?pid=4251hdu 4251 The Famous ICPC Team Again非常裸的模板题,给n个数,m次询问,每次询问一个区间,输出该区间中间大的值。/*划分树:在区间[l,r]内找第k大的数*/# include<stdio.h># include<string.h># include<stdlib.h>
阅读全文
hdu 3911 Black And White
摘要:这题真的是纠结了好久,去年暑假做了好久没能搞出来,昨天再回过头来做,发现有些思路了。贡献了n次wa之后终于改对了。int l1,r1;//标记左右两端分别是什么颜色int ll,rr;//记录左右两端的长度是多少int Blen,Wlen;//记录该区间中连续黑,连续白石头的最长长度是多少int cp;//标记该区间是否被整个turn需要记录下来这些变量,最重要的是cp,它记录的是该区间是否被整个转变颜色。View Code 1 # include<stdio.h> 2 # include<string.h> 3 # include<stdlib.h> 4
阅读全文
hdu 1892 See you~
摘要:看过这题之后,首先想到的是二维线段树,但是后来做的时候发现不太好搞,因为x和y会相互影响的。搜了下解题报告,说是用二维树状数组,然后我就自己开始搞。写过之后虽然AC了,但是跑了1000ms+,感觉太慢了,就搜了下别人的代码,发现我们所理解的二维树状数组有些差别。我是把每一列当成一个一维的树状数组,等于是n多的一维树状数组,然后这样来看成二维的。而别人的直接就是用二维来进行查询更新的。直接看代码吧:“伪二维树状数组”:View Code 1 # include<stdio.h> 2 # include<string.h> 3 # define N 1005 4 int s
阅读全文
hdu 4107 Gangster
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4107线段树。。刚开始没想那么多,直接给每一个区间加两个域,cp和num。cp表示该区间中所有数是否都已经大于等于p了, num表示累加的和。然后对于一次更新,如果该区间所有的数都已经大于等于p了,num+=2*d;否则就更新到最低。毫无疑问tle了。。最后看别人的博客,需要求一个区间的最大和最小值。如果min>=p num+=2*d;如果max<p num+=d;否则就更新下面的一层。code:View Code 1 # include<stdio.h> 2 # include<
阅读全文
hdu 2227 Find the nondecreasing subsequences
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2227Find the nondecreasing subsequencesTime Limit: 10000/5000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 476Accepted Submission(s): 186Problem DescriptionHow many nondecreasing subsequences can you find in the sequence
阅读全文
hdu 1823 Luck and Love
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1823第一道二维线段树, 感觉和一维的基本上一样,只不过多了一个子函数!以身高建立主函数,活泼度为子函数。身高可以转化为0-100, 因为活泼度只有一位小数,可以乘以10转化为整数!code:View Code 1 # include<stdio.h> 2 # include<string.h> 3 # define HMax 405 4 # define AMax 4005 5 struct sub_tree{ 6 int la,ra,Max; 7 }; 8 struct.
阅读全文
hdu 3887 Counting Offspring
摘要:题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3887题意:给出一棵树,对于每一个节点,问他的子孙节点中有多少个节点小于该节点。思路:首先找出这棵树的DFS序列,每一个节点出现在两个位置,这两个位置之间的节点就是该节点的子孙节点。然后用树状数组求出这两个位置之间有多少个节点小于该节点。hdu这题出的有点龊 ,,用dfs搜索会爆栈,要手动模拟先序或者后序遍历!code:View Code 1 # include<stdio.h> 2 # include<string.h> 3 # define N 100050 4 stru
阅读全文
hdu 3030 Increasing Speed Limits
摘要:这道题和上篇介绍的hdu 3450 是同一个类型的题。有点不相同的地方是这道题可以包含长度为1的序列!方法:树状数组+DPcode:View Code 1 # include<stdio.h> 2 # include<string.h> 3 # include<stdlib.h> 4 # define N 500005 5 # define mod 1000000007 6 __int64 a[N],b[N],c[N]; 7 __int64 count[N]; 8 int k; 9 int cmp(const void *a,const void *b)10
阅读全文
pku 3067 Japan
摘要:题意:一个国家分为东部和西部,分别包括n个和m个城市,在城市之间建k条路,问有多少个交点。(不存在三边交与一点的情况)思路:很容易想到转化为求逆序数,可以用归并排序来求,也可以用树状数组。树状数组实现要比归并简单一点。。需要注意:k<=10^6,最后的结果要用__int64 存储归并:# include<stdio.h># include<string.h># include<stdlib.h>struct node{ int from,to,next;}edge[1000005];int head[1005],tol,num[1000005];__i
阅读全文
hdu 3450 Counting Sequences
摘要:*/题意:给定N(N<=100000)个数字ai和一个H,要求求出特殊序列的数量,所谓特殊序列,就是相邻两个数字的绝对值小于等于H并且序列长度大于等于2。解法:树状数组+动态规划思路:首先我们利用dp[i]表示到第i个位置能够找到的相邻数字之差小于等于H的长度大于等于1的序列的总和,那么有状态转移方程dp[i]=sum{dp[j],j<i,abs(a[j]-a[i])<=H},这个做法的时间复杂度是O(n^2),但是n很大,所以不能采用,但是我们观察到这个转移方程是以求和的形式出现,并且有一个限制条件就是abs(a[j]-a[i])<=H,我们可以把它简写成a[i]-H
阅读全文
hdu 4000 Fruit Ninja, hdu 4020 Ads Proposal
摘要:两道树状数组题。推荐一篇介绍树状数组比较好的博客:http://www.cnblogs.com/yykkciwei/archive/2009/05/08/1452889.htmlhdu 4000 Fruit Ninja题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=4000思路:对每个位置处理,考虑后面有多少比他大的数,则该位置上的数与后面两个大数可构成x*(x-1)/2种,再把所有的i<j<k && a[i]<a[j]<a[k]除去。code:# include<stdio.h># includ
阅读全文
hdu 4027 Can you answer these queries?
摘要:暑假集训之后写的第一篇博客。。开学以来一直在准备网络赛,前几场比赛的还可以,再有10天就现场赛了,感觉时间过的好快,好像还有好多的东西都没接触呢。 哎,学校条件不够优越,马上要比赛了还要天天上课。 今年尽力吧,争取拿个银奖!!本题线段树,好长时间都没写过线段树题了,暑假时写过一道,那时写了几个小时没写出来, 之后再碰见线段树题都有点胆怯了,这几天有时间的话再把那题重做一遍。题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4027题目大意:给一个长度为n的序列s,有m次询问,每次询问给出三个数,a,b,c,如果a==1,即输出s[b]+s[b+1..
阅读全文
pku 3667 Hotel
摘要:去年省赛的第八题, “ROOM ASSIGNATION”。和我前几天写的 求某个区间中出现最多的数 差不多。。都是要记录左右端点的连续情况。。题目的意思很简单,问你有没有连续的n的房间,如果有,就输出以那个房间开始(最小的)。如果没有就输出0;还有一种情况:客人要退房间,然后退掉n——n+len-1 这些房间。具体的看代码(其中的updata1,updata2,基本上一样,完全可以只用其中的一个函数,为了方便起见,我没有融合,一个是释放的房间,一个是占用房间):# include<stdio.h># include<string.h># define N 50005st
阅读全文
pku 2528 Mayor's posters
摘要:刚开始写这道题目的时候用的是离散化。。把所有的坐标都给存到数组里面,然后对数组进行排序。。然后每帖一张海报就二分找到两个端点,最后对所有的顶点枚举一遍就行了,,写出来后在pku很快就AC了,之后又在南工交,wa了,感觉存在某些实例过不了。。在pku的discuss里果然发现了,每一个顶点它不单纯的只是一个顶点,它是一段板。比如31 101 36 10这组实例就没能过,因为对于3和6之间的那一段距离访问不到。。之后又想了一种方法,如果排序之后的两个相邻点之间的距离不为1,就增加一个顶点,可以是他们两个之间的任一点,不过为了方便起见,增加s[i-1]+1这个点。(对于上面的那个例子而言,3和6虽然
阅读全文
hdu 1806 , pku3368 Frequent values
摘要:题意: 给n个数,已经按从大到小顺序排列好,一共有q个询问,每次询问一个区间,问这个区间中出现次数最多的数是什么。 题目数据范围: 数的个数,1 <= n <= 100000 询问次数,1 <= q <= 100000 每个数的大小,-100000 <= ai <= 100000 很容易想到建立线段树,并在线段树的每个节点中保存区间中出现次数最多的数 需要解决的问题,两个子结点的信息如何合并到父节点。 很显然,子结点中出现次数最多的数不一定就是父节点中出现次数最多的数, 有可能一个数在两个子结点中的出现次数都不是最多,但是子结点合并成父节点后,这个数的出现次
阅读全文
hdu1542 , 1255,1828矩形面积的并,交,和矩形的周长
摘要:好几天都没写博客了。。这几天一直都在看关于矩形面积的并,交和周长,到现在也稍微理解了一点。。用的都是线段树+扫描线,,共同点都是需要用到离散化,对y坐标进行从小到大排序,除去相等的y点,根据y轴进行建树。。然后扫描线需要记录是矩形的左边界还是右边界。。。每一个结点的c表示该线段被覆盖的次数,具体看代码:矩形面积的并:# include<stdio.h># include<stdlib.h># define N 210struct node{ double x,y1,y2; int f;}Line[N];struct node1{ double lf,rf,cnt; in
阅读全文
hdu 3333 Turing Tree(图灵树)
摘要:很不错的一道线段树题目,做了两天,终于给弄明白了。。。看别人blog的时候,发现总是说离散化,,不明白什么意思。。。上网搜了下,其实就是一种思想的转化,,有时候我们一直在用,只不过不知道叫什么名字罢了。。。比如对于这道题, 我们如果讨论一个数,判断它前面是否出现过,,因为0 ≤ Ai ≤ 1,000,000,000 ,很显然我们不能直接 用一个visit去判断。。但是由于1 ≤ N ≤ 30,000 ,我们可以开一个30000的数组,然后把这些数存起来,排好序, 之后再判断一个数是否出现过的时候, 就可以用二分找到它的下标。。对下表进行visit记录就可以了。。。题意:给出一个长度为N(N&l
阅读全文
zoj 1610 Count the Colors (线段树)
摘要:今天起来的比较晚。。同学问我看没看过线段树,我说看过,她让我做做今天的一日一题--zoj1610线段树是去年暑假学的,快一年了,都没怎么看过,幸好前两天看了自己的一个模板,然后今天仍然记忆尤新。。11点多开始敲代码,中间改了又改, 最后终于在2点时候搞定了。。这个题目需要注意两点,由于是对线段进行的操作,所以需要访问到所有的线段,建树的时候需要注意一下,maketree(begin,tree[step].mid,2*step);maketree(tree[step].mid,end,2*step+1);以前都是对点进行操作的,然后下面那行就是maketree(tree[step].mid+1,
阅读全文
树状数组 (模版)
摘要:去年的暑假集训的时候,也看了下树状数组,那时候没学会就放下了,前两天下载一个课件又好好的看下,感觉也理解了一点 ^_^...使用树状数组局感觉限性不小, 只有进行特殊的 题目才比较实用, 对一般的题目还是用线段树的好。。以后坚持每天都写一篇博客吧,记录下每天的心得^_^代码:/*所谓的树状数组*/# include<stdio.h>int a[20],m;int Lowbit(int n){ return n&(n^(n-1));/// 2的k次幂==n&(n^(n-1)) ( ^ 是异或的意思,) k表示把n转化为2进制后 后面的0的个数}int sum(int
阅读全文
浙公网安备 33010602011771号