UVa 12265 - Selling Land】的更多相关文章

链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3417 题意: 输入一个n*m(1≤n,m≤1000)矩阵,每个格子可能是空地,也可能是沼泽.对于每个空地格子,求出以它为右下角的空地矩形的最大周长,然后统计每个周长出现了多少次. 分析: 扫描法 + 单调栈.按照从上到下的顺序处理每一行,在每一行中从左到右处理每个格子(以下称为“当…
紫书上分析了很多很多,超详细,= ̄ω ̄= 每扫描一行可以计算一个height数组,表示从这块空地向上延伸多少块空地,而且这个数组可以逐行递推. 首先对于每一行来说维护一个单调栈,栈里放的是矩形的左上角,而且横坐标c和高度h也都是递增的,另外对于扫描到的同一个右下角,矩形面积的大小只与左上角的横坐标c和高度h的差值h-c有关,所以栈里面的h-c也都是递增的. 另外,计算出来当前的height[j]的时候有可能会“削减”栈中的矩形. #include <cstdio> #include <c…
题意 输入一个\(n\times m\)的矩阵,每个格子可能是空地,也可能是沼泽.对于每个空地格子,求出以它为右下角的空矩形的最大周长,然后统计每个周长出现了多少次. 思路 对于 每一行 每两个沼泽之间的连续部分 维护一个单调栈,维护对于当前位置(右下角位置)可取的前面的一系列的左上角位置. 因为向右移动时新加进来一个较低的会将之前高的削低,即会修改之前栈中可行的点的高度,所以本题中仅维护位置是不够的,需要维护位置\(c\)和高度\(h\)两个属性. 注意到,\(c\)显然是单调增的,单调栈维护…
见紫书.(c,h)的更新策略://前面的高度为0了,直接插入因为ans==-c+h,c大,h还小,那么肯定不是最优左上角,更新新加入列的列//新的一列高度最小,就删掉了其他的,只留这个高度从上到下,从左到右扫描一遍 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ; char s[maxn][maxn]; ]; struct Rect { int c, h; Rect…
题意: 给定n个圆的 坐标 和半径, 求第一个圆与其他圆相交的面积占第一个圆的面积的多大. 分析: 如果从局部去想, 处理每个圆之间的关系, 求出他们与第一个圆的交集, 这样可能就会十分复杂了. 不妨从总体去想, 因为答案要求的数字并不是十分精确(保留两位小数),  那么我们可以试试随机算法, 想象在第一个圆内撒绿豆, 那么绿豆肯定会落到第一个圆与其他圆相交的区域, 这时候统计一下撒的绿豆和在区域中的绿豆就可以大概算出这个数字了. 这里有个技巧是用 rand() /(double)(RAND_M…
题目大意: 有一个矩阵 有些点可以取有些不能 求以每个点为右下角的子矩阵(里面点都可以取)的周长最大值 最后统计出每个周长对应矩阵的个数 思路: 单调栈 先预处理出每个点向上最多能延伸多长记为h(i,j) 然后对于每行维护一个单调栈记录每行最远可以达到的左端点和该矩形的高 该单调栈满足高单调递增 每次加入一个元素时,判断新增加的高度是否比减去的长度多 若是,就加入栈,反之不入栈 #include<iostream> #include<cstdio> #include<cstd…
首先可以用扫描法处理出一个height数组, 来保存从当前行开始, 每一个格子可以向上延伸的最大长度. 这种"延伸"的问题用扫描法, 因为往往这个时候可以利用前一次的结果来更新当前的值 然后这道题的关键就是是维护一个单调栈, 栈顶的元素就是当前状态所求的答案. 这个单调栈满足的性质是:c从小到大增加, h从小到大增加, h-c从小到大增加.c表示当前列, h表示height[c] 因为遍历的时候是从左到右的, 所以c就是一直增大的, 然后加入的时候有个while循环, 保证h是一直增大…
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem 10983 18765 Y 1036 [ZJOI2008]树的统计Count 5293 13132 Y 1588 [HNOI2002]营业额统计 5056 13607 1001 [BeiJing2006]狼抓兔子 4526 18386 Y 2002 [Hnoi2010]Bounce 弹飞绵羊 43…
暑假写的一些博客复习一遍.顺便再写一遍或者以现在的角度补充一点东西. 盛暑七月 初涉基环外向树dp&&bzoj1040: [ZJOI2008]骑士 比较经典的基环外向树dp.可以借鉴的技巧在于将每一个环拆出一条边,使剩下部分成为树.再然后就是max(f[u][0],f[v][0])思考中可能会出现的纰漏. ; i<=n; i++) { v[i] = read(), tt = read(); if (get(tt)!=get(i)){ addedge(i, tt); fa[fa[tt]…
题目大意:和UVa 836 - Largest Submatrix差不多,只需要修改一下数据就可以了. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define MAXN 110 int mat[MAXN][MAXN], sum[MAXN][MAXN]; int main() { #ifdef LOCAL freopen("in", &…