摘要: 题意描述:给定一个矩阵,输入为左上角和右下角,现在要计算出所有矩阵重叠之后的面积总和。解题思路:根据x轴或者y轴建树,不过数据如果够大,必须先离散化,利用扫描线记录当前区间已经被覆盖的长度,那么现在覆盖的长度乘以下一条线段的距离,这个面积则是我们需要累加的面积。其中的测试数据计算过程如下:View Code 1 #include<iostream> 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<algorithm> 5 #include<string.h> 6 using st 阅读全文
posted @ 2012-10-30 21:04 诺小J 阅读(178) 评论(0) 推荐(0) 编辑
摘要: 不绕弯子,线段树区间值维护。每个区间应记录的值,lazy,val[12],val数组当中记录的是该区间当中每一个级数最大的经验值,如果此时经验值能够使得英雄升级,在一段区间当中有某个结点需要更新,此时我们如果用update操作的话,就要更新到最底层,那么此时线段树就没有意义,所以现在我们必须要控制一下, 只更新升级了的区间,那么我们就避免了更新一些不必要的点,因为当区间中的英雄级数不变的时候,经验累加的规则是不会改变的,所以只要精心敲一下其中的pushdown就ok了。在向下的更新当中,最终要的是,更新了底层的话,上层也必须要更新,所以要特别注意,总结线段树的经验,其实最要紧的就是心要够细,如 阅读全文
posted @ 2012-10-27 22:12 诺小J 阅读(165) 评论(0) 推荐(0) 编辑
摘要: 思路: 线段树结构更新维护,结构内部包括 1的最大左连续、最大右连续、最大连续长度,0的最大左连续、最大右连续、最大连续长度,1的个数、覆盖值、取反,一共9个值,其中的取反操作要特别注意,其余的看代码吧。。 如果代码看不懂的话,建议先做一下区间最大连续和、还有poj 3225.View Code 1 #include<iostream> 2 #include<stdio.h> 3 using namespace std; 4 const int N = 100003; 5 struct node 6 { 7 int lo,ro,mo; 8 int ... 阅读全文
posted @ 2012-10-24 18:58 诺小J 阅读(154) 评论(0) 推荐(0) 编辑
摘要: 题目描述:输入包括n,m,n表示现在一共有n个相邻的房间,m表示有m条命令。1 a 表示现在来了一个人数为a的队伍,需要一个连续的区间能够容纳这么多人,如果能够容纳,输入最靠左边的房间的号码,否则输出0。2 a,b 表示清空[a,a+b-1]区间内所有的房子解题思路: 线段树结构体,定义需要记录的三个值,最大左连续、最大右连续、最大连续。由上面的图可知,我们现在要更新两端区间,此时,合并区间的最大连续房间数只有三种情况:1、 左区间最大连续房间数2、 右区间最大连续房间数3、 左区间最大右连续房间数 + 右区间最大左连续房间数只要能够维护这些值,当中的更新和询问就好办了。代码:View Cod 阅读全文
posted @ 2012-10-23 19:18 诺小J 阅读(185) 评论(0) 推荐(0) 编辑
摘要: 题目描述:输入:U [1,5]D [3,3]S [2,4]C (1,5)I (2,3]输出:(2,3)解题思路:题意很明显,主要就是为了完成集合当中的并、交、差以及异或运算。仔细分析一下题目这五种运算:设T左右区间分别为l,rU T将(l,r)当中的所有点都置为1I T保留l,r中1的位置,将(-∞,l)(r,+ ∞)置为0D T将(l,r)当中全部置为0C T将(l,r)当中0,1互换,将(-∞,l)(r,+ ∞)置为0S T将(l,r)当中0,1互换至于开区间和闭区间的分别,可以用扩大总区间变为原来的两倍,用偶数来表示闭区间,基数来表示开区间。其实这个线段树题,我觉得最难的还是在取反的过程 阅读全文
posted @ 2012-10-23 12:54 诺小J 阅读(226) 评论(0) 推荐(0) 编辑
摘要: 题目描述:给定一个含有N个整数的序列,它们的下标从1到N,对该序列进行如下2种操作; 0 a b将下标为a的值变为b。 1 a b求下标[a,b]之间的最大连续和解题思路:每一段区间当中必须记录相应的值以便于更新,其中的值包括了该区间的最大左连续和、最大右连续和、最大连续和以及总和,如图分析:那么线段树此时从下往上更新的时候,合并区间时,那么对于此时我们要维护的区间最大连续和最多有三个值能够取,左区间最大连续和、右区间最大连续和、左区间的右最大连续和 + 右区间的左最大连续和,那么此时维护起来就特别的简单了。。代码如下:View Code 1 #include<iostream> 阅读全文
posted @ 2012-10-23 10:57 诺小J 阅读(234) 评论(0) 推荐(0) 编辑
摘要: 在一个园形操场的四周摆放N堆石子(N≤100),现要将石子有次序地合并成一堆。规定每次只能选相邻的两堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。编一程序,由文件读入堆数N及每堆的石子数(≤20),① 选择一种合并石子的方案,使得做N-1次合并,得分的总和最小;② 选择一种合并石子的方案,使得做N-1次合并,得分的总和最大。例如,所示的4堆石子,每堆石子数(从最上面的一堆数起,顺时针数)依次为4 5 9 4。则3次合并得分总和最小的方案:8+13+22=43得分最大的方案为:22+18+22=54解题思路:根据题意来拟定状态,dp[i][j]从i到j堆石子合并所得总分最大或者最小 阅读全文
posted @ 2012-10-22 21:05 诺小J 阅读(410) 评论(0) 推荐(0) 编辑
摘要: 可能写解题,对于ac的大家来说应该是一件比较高兴的事情吧。。但是这次我却是在省赛里面迷失了,原本这次省赛一道赤裸裸的LCIS,但是还是因为没有接触过,所以没能~~过多的话不说了,还是好好写好解题吧。。思路:对于做dp的人而言,规划处最优子结构是解决一切题目的第一步,二此题的最优越子结构规划一下,DP[i][j] 为序列1前i个元素和序列2前j个元素最长公共上升子序列多长。那么这个时候初始值初始化为0的话,碰到序列1和序列2相等的情况只要依靠相等位置前的序列来得出状态即可,更新完整个dp数组。代码如下:View Code 1 #include<iostream> 2 #include 阅读全文
posted @ 2012-10-17 19:30 诺小J 阅读(1599) 评论(0) 推荐(0) 编辑
摘要: 题意很明显,就是指在一个地图上面有n个人,有n个房间,然后要使得这些人能够到达一个房间,并且移动的步数最短。看这道题目的人相信应该都是正在学习km算法的人。。我推荐文库当中的这个资料,说实话,比较精炼,看起来不至于繁琐。。转载:http://wenku.baidu.com/view/072015d133d4b14e852468a9.html说说我对km算法的看法吧。。 之前一直想要搞清楚这个是什么样的原理,但是现在发现其实观察一下细节你就能发现这个算法的思想,特别是这个定标的设置,说实话我现在也不知道这个的原理是什么,但是基本上我的体会就是讲一个二分图当中的两堆顶点设为X、Y集合,因为是为了求 阅读全文
posted @ 2012-09-05 17:48 诺小J 阅读(219) 评论(0) 推荐(0) 编辑
摘要: 差不多三天的时间过去了,学了一个网络流最大流。。现在来总结一下。。。先说一下之前那个ek的算法,说实话,这个算法本质上很好去理解,就是利用一个广搜不断的搜出所谓的增广路径。View Code 1 #include<iostream> 2 #include<string.h> 3 #include<queue> 4 #define N 110 5 using namespace std; 6 int map[N][N]; 7 int n,np,nc,m,s,e,w; 8 int link[N],num[N],answer; 9 ... 阅读全文
posted @ 2012-09-04 15:51 诺小J 阅读(159) 评论(0) 推荐(0) 编辑