08 2013 档案
LA4329,poj3928树状数组原理和应用
摘要:链接:http://poj.org/problem?id=3928题意:一条街上有n个人,每个人都有一个不同的值 a ,进行要求选3个人,1个裁判,2个选手,满足:裁判必须住在选手中间,裁判的值也要在选手中间。求能有多少种比赛。思路:枚举第 i 个人当裁判,设 a0 到 ai-1 中,有 bi 个数比 ai 小,ai+1 到 an-1中有 di 个数比 ai 大,那么比赛种数为 b[i]*(n-i-1-d[i])+(i-b[i])*d[i].要求 bi 和 di ,可以采用树状数组。ai 的最大值为100000,那么BIT的范围是1-100000,A[100000]的每个数 A[i] 代表一个
阅读全文
poj2828线段树点修改,区间和
摘要:链接:http://poj.org/problem?id=2828题意:n个人排队,每个人有一个权值,给出他们插队的位置,求最后的顺序,按顺序输出权值。思路:看到这题目,我想这货和线段树什么关系啊,这货怎么能用线段树来做呢。诶,大千世界无奇不有,线段树就是这么的神奇,叹叹!!!闲话少说,走起。逆着想,最后一个人插队后, 他的位置就是确定了下来的。倒数第二个人插的话,位置在最后一个的前面,最后一个对他无影响,位置在最后一个后面,则最后一个对他有影响,他必须往后移一位。线段树叶子节点保存的是这个位置上的空位数,初始化为1,如果这个位置上有了一个数,那么减一。但是我不明白在查找的时候,为什么用当前人
阅读全文
hdu4607树的直径,spfa
摘要:链接:http://acm.hdu.edu.cn/showproblem.php?pid=4607题意:前一阵子做的,题意忘记了,大体就是求树的直径,就是树的最长路的长度。思路:树的直径有这么一个算法,从树上任意一点出发,找一条最长路,终点为A,再从A点出来,找一条最长路,终点为B,那么树的直径就是AB的长度。求最长路可用dfs或者spfa来写。#include#include#include#include#includeusing namespace std;const int maxn=100000+5;const int INF=0x3f3f3f3f;//不能随便写,不然后面的mems
阅读全文
hdu2795线段树,点修改,区间最值
摘要:链接:http://acm.hdu.edu.cn/showproblem.php?pid=2795题意:一个高h宽w的木板,要往上面贴字条。每条字条的高度都为1,长度为wi,贴的时候字条要尽量往左上方贴。求每条字条贴在哪个位置,比如左上方第一条的位置为1,如果贴不下的话输出-1.思路:想不到这可以用线段树来做。这题有个关键是字条的高度都是确定为1的,所以可以以木板的高h来建一个[1,h]的树。每个叶子节点对应的是位置,保存的是可以使用的长度,初始化为w,如果在某个位置上贴上一个字条的话,相应的叶子节点的值要减去这个wi,完成更新。在查找的时候,二分查找,找的是最大值的位置插入,这里有点不理解。
阅读全文
hdu1394线段树点修改,区间求和
摘要:链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394题意:给一个0-n-1的排列,这个排列中的逆序数为数对 (ai, aj)满足 i aj的个数。依次把第一个数放到排列的末尾会得到另外n-1个排列,求这n个排列中的最小的逆序数。思路:关键是要把第一个排列的逆序数求出来,后面的排列可以递推出来。假如第一个逆序数为s0,当把a0从首位移到末位时,新得到的s1应该是在s0的基础上加上比a0大的数的个数,减去比a0小的数的个数。由于这一串数是一个0-n-1的排列,所以比a0大的数的个数为 (n-1)-(a0+1)+1=n-a0-1,比a0小的数的个数为 .
阅读全文
CF Mysterious Present最长上升子序列(未完)
摘要:链接:http://codeforces.com/problemset/problem/4/D题意:有一张卡片,若干张信封,它们有个长和宽。要求,找到数量最多的一串信封,这一串信封满足信封的长和宽都是严格递增的,而且卡片的长和宽要比最小的信封小。思路:先对长度排个序,然后求宽度的最长上升子序列。要处理好长度相等的信封。#include#include#include#include#include#include#includeusing namespace std;const int maxn=5005;int dp[maxn],c[maxn];struct en{ int w,h,f...
阅读全文
zoj1986,poj1631,最长上升子序列,复杂度O(n*logn)
摘要:链接:http://poj.org/problem?id=1631题意:最长上升子序列。复杂度为O(n*logn).思路:这道题只能用nlogn的算法,n^2的话会卡掉。下面这两个个链接介绍nlogn的算法讲的还可以。http://www.cnblogs.com/celia01/archive/2012/07/27/2611043.htmlhttp://blog.sina.com.cn/s/blog_4b1e4fe9010098af.html代码如下:#include#include#include#include#include#include#includeusing namespace
阅读全文
zoj2136最长上升子序列,复杂的O(n^2)
摘要:链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1136题意:裸的最长上升子序列。复杂度O(n^2).#include#include#include#include#include#include#includeusing namespace std;const int maxn=1005;int n;int a[maxn],dp[maxn];int LIS(){ dp[0]=1; int ans=1; for(int i=1;is && a[j]ans) ans=dp[i];...
阅读全文
codeblocks快捷键
摘要:Retrievedfrom "http://wiki.codeblocks.org/index.php?title=Keyboard_Shortcuts"Keyboard ShortcutsEditor FunctionShortcut KeyUndo last actionCtrl + ZRedo last actionCtrl + Shift + ZCut selected textCtrl + XCopy selected textCtrl + CPaste text from clipboardCtrl + VSelect all textCtrl + ASwap
阅读全文
hdu1754简单线段树,点修改,区间最值
摘要:链接:http://www.cnblogs.com/54zyq/p/3222818.html题意:中文题~思路:线段树点修改,求区间中的最大值。#include#includeusing namespace std;#define lson l,m,rt>1; build(lson); build(rson); PushUP(rt);}void update(int p,int s,int l,int r,int rt){ if(l==r) { MAX[rt]=s; return; } int m=(l+r)>>1; ...
阅读全文
hdu4666最远曼哈顿距离
摘要:链接:http://acm.hdu.edu.cn/showproblem.php?pid=4666题意:给出若干个n维的点,求它们的最远曼哈段距离。参考:http://www.cnblogs.com/lmnx/articles/2479747.htmlPOJ 2926 Requirements:http://poj.org/problem?id=2926#include#includeusing namespace std;const int maxn=60000+5;int a[maxn][7];int q,k,w;multiset m[40];void solve(int s,int fl
阅读全文
hdu4681 DP,最长公共子序列
摘要:链接:http://acm.hdu.edu.cn/showproblem.php?pid=4681题意:给三个串a,b,c,要求找到一个最长的d串,满足d是a和b的字串,c是d的子序列。思路:大体是把a,b串分为三个部分,中间一部分是包含c的子串,要想要d最长,所以中间这一截长度要最小,所以这一截的开始要是c[0],结尾要是c[n-1],枚举出这些个位置。假设这个串在a,b中的首尾位置分别为ai,aj,bi,bj,再求出ai,bi之前最长公共子序列的长度dp[i-1][j-1],ai,bi之后最长公共子序列的长度dp[i+1][j+1],答案为这两个公共子序列的长度加上c的长度的最大值。
阅读全文
hdu4667凸包,切线
摘要:链接:http://acm.hdu.edu.cn/showproblem.php?pid=4667题意:给n个圆m个三角形,求包住它们所需的最小长度。思路:比赛的时候只想到了三角形用凸包围一下,圆不知道怎么处理。暴力一点的方法呢,把圆均分成了2000个整点,然后求凸包,圆弧上的弧线也用折线替代,这样对精度有损,一开始分成1000个点的时候精度就不够,wa掉了,如果圆上的弧线还是算弧长的话,可能还是可以过的。解题报告上说的是求任意两圆的外切线,得到所有切点,三角形顶点和圆的切点,三角形的顶点来求凸包。暴力:#include#include#include#include#include#incl
阅读全文
uva1438 ,poj3862 三维凸包
摘要:题意:给出两个凸多面体行星,求出二者重心的最近距离。行星密度均匀分布,可以旋转与平移。思路:由于行星可以任意放,所以要想他们重心距离最近,那么两个行星必然有两个面贴在一起。所以题目转换成求凸多面体的重心到面的最近距离。由于题目给出的是点,所以先求三维凸包,求出面,再算重心到面的距离。多面体重心的计算,先把多面体分解成若干个四面体,重心C=( ∑ Ai*Ci ) / A, Ci=(四面体四个顶点坐标和)/4, Ai是四面体体积,用混合积除以6,A是多面体总体积。
阅读全文
hdu4617三维几何,异面直线距离
摘要:题意:给若干无限长的圆柱,知道圆柱轴心上的一个点和同平面上的另外两个点,还有半径,判断是否有圆柱相交,不相交则输出最小距离。思路:由于已知同平面上的三个点,其中一个点还是轴线上的点,所以可以确定出一个平面,然后求出法向量,法向量和轴心上的点就可以确定出轴心直线了。然后计算任意两条空间直线间的距离,由于只有30个圆柱,暴力嘛,用距离减去两圆柱的半径和,小于等于0则相交,大于0就不相交。空间直线的距离d=|AB*n| / |n| (AB表示异面直线任意2点的连线,n表示法向量,法向量为两条异面直线方向向量的叉积,|n|表示模。#include#include#include#include#inc
阅读全文
uva11275简单三维几何
摘要:链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=538&page=show_problem&problem=2250题意:判断两个空间三角形是否相交思路:恩恩,就判断一下。#include#include#include#include#include#include#includeusing namespace std;const int maxn=1000;const double eps=1e-8;struct Point3{ double x
阅读全文
poj3384半平面交
摘要:链接:http://poj.org/problem?id=3384题意:一个凸多边形,用两个半径相等的圆来覆盖,要求覆盖面积最大时的圆心坐标。思路:把凸多边形每条边向内移r的距离,用半平面交求出新的多边形,由于要使覆盖面积最大,所以两个圆心应该是多边形的顶点中距离最远的两个。要注意当这个多边形退化为一个点时,此时两个圆心是重合的。一直wa,内伤,最后发现是模板,的问题。。。《训练指南》上的半平面交模板,当半平面交退化为点和线段时返回值都是0,不适合此处,然后改了一下onleft()函数,如果最后的结果其实只有一个点,返回的m不为1,而是重复的个数,虽然这道题过了,但是算法有问题,或可用增量法求
阅读全文
uva1396,poj3525半平面交+二分
摘要:链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=533&page=show_problem&problem=4142提议:海中一个凸多边形小岛,求出岛上离海最远点到海的距离。思路:就是求这个凸多边形内切圆的最大半径。对半径进行二分,将多边形所有边向内平移半径的长度,然后求半平面交,如果有交则有满足的点。在poj上用g++交wa了,c++又过了。。。坑#include#include#include#include#include#includeusi
阅读全文
LA2218半平面交
摘要:没有想到这个题可以转化成解方程组的形式,就像线性规划一样,觉得好神奇。《训练指南》上的解析挺详细的,就不写了。#include#include#include#include#include#includeusing namespace std;const int maxn=110;const double eps=1e-8;struct Point{ double x,y; Point(double x=0,double y=0):x(x),y(y) {}};typedef Point Vector;struct DLine//有向直线directed line{ Poin...
阅读全文
uva1453 旋转卡壳算法
摘要:链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4199题意:给出若干个正方形,求出他们的顶点中距离最大的两个点间的距离的平方。思路:很直接的求点集的直径,采用旋转卡壳算法。算法参考:http://www.cppblog.com/staryjy/archive/2010/09/25/101412.html#include#include#include#include#include#includeusing namespa
阅读全文
uva10256 凸包
摘要:链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1197题意:平面上n个红点,m个蓝点,问是否存在一条直线,使得任取一个红点和一个蓝点都在直线异侧。思路:可以把《训练指南》上的两个思路换一下顺序,求出两个凸包之后,先判断一个凸包上的点是否在另一个凸包内侧,不需要判断所有红色的点是否在蓝色凸包内,只要判断红凸包上的顶点就够了。再来判断线段相交,这时只要判断是否是规范相交就好了。觉得数据有点水。#include#include#
阅读全文
uva11168 凸包
摘要:链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=34780题意:给n个点,找一条直线,使得所有点在直线同侧,且到直线的平均距离最小。思路:先求出n个点围成的凸包,然后枚举凸包上的顶点,得到直线的一般方程,再计算出各点到直线的距离和。由于所有的点都在直线的同一侧,所以A*x0+B*y0+C的符号相同,故而可以求出所有点的x坐标和y坐标的和,总距离就很快算出来。注意凸包退化成一个点或者一条线段的情况,当退化成一个点时,A=B=0,除以sqrt(A*A+B*B)为无穷大,要特判一下,如果是一条线段,那结果就是0了。#inc
阅读全文
浙公网安备 33010602011771号