poj
文章平均质量分 68
ZhouMu
这个作者很懒,什么都没留下…
展开
-
POJ--2441--Arrange the Bulls--状压DP-滚动数组优化
dp[i][j] 表示前 i 头牛放成 j 状态的数量然后就可以状压DP 了,提前看了一discuss,说要用滚动数组,想想也是,加上数组优化后空间用了9M,不用滚动数组的话使用空间就是 9*10 = 90M ,题目只给了64M的空间。刚提交了一下不优化空间的,还真MLE了。。。。。。。。。我是不是很无聊。。。亲自验证一下而已-_-##include#include#includeu原创 2013-08-12 10:43:35 · 554 阅读 · 0 评论 -
POJ--2236--Wireless Network
并查集的简单应用由于只有1001个点,所有可以预处理每个点到其他任一点的距离。然后对于修复操作来说。假设修复的点是x。则:依次检查每一个点i,如果点i已经修复了且距离小于等于d,则合并点i和点a的集合对于询问来说,直接查找就可以了#include#include#include#define maxn 1003using namespace std;double原创 2013-06-17 09:09:42 · 477 阅读 · 0 评论 -
POJ--3321--Apple Tree
树状数组的应用。深搜记录每个点在C数组中的第一次访问位置和离开位置,分别是l数组和r数组。则题目所求以点x为根的子树和就是c[r[x]]-c[l[x]-1]额,,然后关于树的存储问题,,vector被卡掉了,然后换了个左孩子右兄弟也被卡掉了,TLE换了个邻接表,过了。题目里有10 W个点,discuss里面一句话说得很对,会用stl的人知道什么时候可以用stl,什么时候不能原创 2013-06-17 00:54:59 · 506 阅读 · 0 评论 -
POJ--1988--Cube Stacking
复习一下并查集的统计问题#include#include#include#include#define maxn 30020using namespace std;struct PPPP{ int fa; int v;//表示该点的上方不包括该点有多少个方块}p[maxn];int top[maxn];//表示包括该点的下方一共有多少个方块int n;原创 2013-06-16 23:48:28 · 566 阅读 · 0 评论 -
POJ--1703--Find them, Catch them
并查集,一个只有两个集合。输入告诉你两个人不是同一个集合,然后问任意两个人是不是同一个集合的。假设有N个人,用p[A+N]表示第A个人对立集合。PS:从杭州回来好久没写题。以后比赛不想被虐,就在训练的时候自虐吧。#include#include#include#define maxn 100020using namespace std;int p[maxn*2];int n原创 2013-06-16 22:22:09 · 456 阅读 · 0 评论 -
poj--1470--tarjan算法
模板留着#include#include#include#include#define maxn 10020using namespace std;vector g[maxn]; //treevector q[maxn]; //queryint n,m;int x,y;bool vis[maxn];int root;int f[maxn];int ant[原创 2013-05-29 16:21:14 · 425 阅读 · 0 评论 -
POJ--3386--Frequent values--RMQ
贴完代码就滚,杭州邀请赛被虐的节奏-_-##include#include#include#define maxn 100200using namespace std;int num[maxn],ic,last_num;int pos[maxn];int a[maxn],n;int sum[maxn];int x,y,m;int dp[maxn][20];bool ini原创 2013-05-26 16:09:42 · 576 阅读 · 0 评论 -
POJ--1986--Distance Queries--LCA-RMQ
题目大意:求一棵树任意两点的距离解题报告,设一个数组 dis[i]表示i节点到跟节点的距离,则任意两点的最短距离:dis[i,j]=dis[i]+dis[j]-2*dis[LCA(i,j)]这个公式还是比较直接的吧这样就转化成了一个LCA问题。召唤模板就不吐槽WA到死的代码,换个节点存储方式就过了,简化的数据存储方式可以降低编程复杂度。PS:此题中的东西南北的方向是不需要的原创 2013-05-24 20:52:52 · 463 阅读 · 0 评论 -
POJ --1985--Cow Marathon
题意:在一棵树上,有边权,求出距离最大的两个点之间的距离解题报告:借助动态规划的思想来做,由于每个点有四个方向的距离,记录每个树上每个节点到其子节点的最远距离maxlen[i],由于节点之间具有层次(祖先)关系,所以需要增加一个fa数组记录节点之间的继承关系,然后进行一次深搜,确定节点之间继承关系。树上任意两点的唯一最短路径是一条链,所以这个最远距离点对的路径也是一条链。这个最远的原创 2013-05-24 10:33:29 · 541 阅读 · 0 评论 -
poj--1470--Closest Common Ancestors--LCA
树上找任意两点的最近公共祖先,模板题手写模板无压力、、、就是用了一下午求LCA的具体步骤:1:对树从根节点深搜,对每条深搜到达的边的顶点,记录深度(l数组记录)和搜索的的序号(就是这个点是第几个搜索到的,e数组记录)2:记录每个节点在e数组中第一次出现的位置(r数组记录)3:对于每次询问的两个点(a,b),从r数组得到这两点最先访问到的顺序,假设r[a]=lx,r[b]=ly,原创 2013-05-22 19:35:16 · 478 阅读 · 0 评论 -
POJ--1984-Navigation Nightmare--并查集
当并查集中有附加值域的时候,在合并节点的时候要小心维护值域的更新。对于本题来说,写两个函数,一个函数findset(int u),用来返回节点u的根,并在查找过程中进行路径压缩。另一个函数merge(int a,int b)用来对两个节点a,b进行合并。假设合并的两个点(a,b)的根为(x,y);此时使点y的父亲节点为x,并且需要更新节点y的值域(此题中为横坐标与竖坐标的偏移量)。这样原创 2013-05-24 08:50:04 · 542 阅读 · 0 评论 -
POJ--2051--Argus
题目大意:有很多的询问,至于问什么就不用纠结了,需要的只是每个询问的 id和要求答案的间隔时间,也就是说,每个询问,我要每间隔per的时间就需要一个答案。题目输入每个询问的id和要求答案的间隔时间,要求输出前K个回答的先后顺序,如果同一时间回答了两个询问,则按id排序输出。题解:一个优先级队列即可#include#include#include#include#include原创 2013-06-21 10:54:45 · 553 阅读 · 0 评论 -
poj--1442--black box
题目大意:有一个黑盒,每次往里面加一个数字,在加到特定数量的数字的时候询问第k小的数字解题报告:学习了用优先队列来实现一个最大堆和一个最小堆来维护第K小的数字,细节有点麻烦。参考:点击打开链接#include#include#include#define maxn 30020#define debugusing namespace std;struct maxHeap原创 2013-02-27 10:21:05 · 401 阅读 · 0 评论 -
POJ--1185--炮兵阵地--状态压缩DP
话说过了很久,又把这个题目写了一遍,这次代码精简多了,话说粗心写错了两个地方,调试了很久。。。感觉很冤枉,论写代码时思维的严密性与细心#include#include#includeusing namespace std;const int MAX_N = 110;const int MAX_M = 15;const int MAX_ST = 100;int sc原创 2013-08-10 11:13:12 · 488 阅读 · 0 评论 -
POJ--线段树成段更新--树状数组做法
在discuss里面看到有用树状数组做的,于是找了个做法http://kenby.iteye.com/blog/962159貌似和我线段树的时间差不多,都是1600ms 左右,但是人家就可以进1秒,大概是我代码写挫了吧#include#include#include#define lowbit(x) ((x)&(-x))using namespace std;typedef lo原创 2013-08-21 23:25:44 · 531 阅读 · 0 评论 -
POJ -- 3468 --线段树成段更新
很久以前的题目再做一遍复习一下。要点:1)约定在任何时候 add_num 到达节点的时候就立即更新节点的 sum 值。2)每次更新节点回溯的时候记得维护节点的 sum 值。3)执行询问操作的时候,遇到 lazy 标记为1 的时候往下 Push_down,,同时记得第一点4)遇到符合要求的询问区间时,由于第一条的规定,直接返回 sum 值,而不必加上 区间长度*add_num原创 2013-08-21 21:24:19 · 616 阅读 · 0 评论 -
两个单调队列代码
好久没写题解了,可耻啊可耻POJ 2823 点击打开链接FZOJ 1894 点击打开链接POJ 2823#include#include#include#include#include#include#include#includeusing namespace std;const int MAXN = 1000020;struct node{原创 2013-08-07 12:32:06 · 508 阅读 · 0 评论 -
POJ--2299--Ultra-QuickSort
题目大意:给出一个数字序列,问冒泡排序需要交换数字的次数。好题啊。。。看着1W多的通过数,以为是水题呢。解题思路,求出序列中的逆序对数就是需要交换的次数,求逆序对数可以用树状数组求,但是题目给的数据范围略大,需要离散化原来的数据。所以第一步:先对原来的数据排序,再离散数据,,用1-N 的数表示出各个数字的大小关系就可以了。第二步:通过树状数组求出逆序对数即可。如果你不知道怎么通过树原创 2013-06-28 21:57:35 · 501 阅读 · 0 评论 -
POJ--1868--Antiarithmetic?
题目大意:给出一个数字序列,假设这个序列长度为N,序列所有的数字不相同而且小于N。问这个序列有没有子序列构成等差数列解题思路。。。直接看代码吧,简单到爆。O(n^2)的代码居然过了。。。。。。。#include#include#include#define maxn 10030using namespace std;int n,a[maxn],pos[maxn];bool原创 2013-06-28 21:02:16 · 641 阅读 · 0 评论 -
POJ--3141--Distant Galaxy
题目大意:给出100个点的坐标,找一个矩形,让这个矩形的边界包含最多的点解题报告: 考虑矩形的四条边界。枚举矩形的上下边界(O(n^2)),然后从左往右扫描每一条竖线,用三个数组记录扫描到的每一条竖线相关信息(参考下图),left数组表示竖线左边的上下边界(不包括竖线)上的点的总数,on数组保存竖线上点的总数(不包括上下边界上的点),on2数组保存竖线上的点的数量(包括上下边界上的点)。原创 2013-06-27 13:24:12 · 738 阅读 · 0 评论 -
POJ--1281--MANAGER
模拟题,有入队出队操作,每次出队的时候根据不同的策略,选择优先级最小的出队或者优先级最大的出队。两个优先级队列,一个模拟大顶堆,一个模拟小顶堆,出队的时候按照要求出队就可以了。但是用两个队列模拟一个队列有个同步性问题,可以用一个数组vis表示该元素是否已在真实的队列中出列,这样就解决了两个队列模拟一个队列操作的同步问题。详情见代码(个人觉得代码比较挫,要是再复杂一点的模拟题就直接跪了)原创 2013-06-24 00:19:23 · 798 阅读 · 0 评论 -
POJ--2567--Code the Tree
直接 模拟,然后,每次找到编号最小的一个点的父亲输出就可以了。注意格式,输入输出就OK 了#include#include#include#include#include#define maxn 10000using namespace std;char s[maxn];vector g[51];int n;void init(){ for(int i=0;i原创 2013-06-22 18:06:41 · 601 阅读 · 0 评论 -
ZOJ_-1470--How Many Trees
题目大意:给出平衡二叉树的定义(即左右子树高度差不超过1,然后递归定义),题目输入树的节点数和叶子树,求符合条件的平衡二叉树的数量是多少?是个DP吧。dp[i][j][k]表示节点数为i,叶子树为j,高度为k的平衡二叉树的数量。题目给出的条件n<=20,m<20.树的高度上限为6.初始条件dp[0][0][0]=dp[1][1][1]=1;需要构造一颗高度为k 的平衡二叉树的,原创 2013-06-22 10:45:09 · 577 阅读 · 0 评论 -
POJ--1770--Special Experiment--树形DP
互相排斥的点,连一条边,然后就是很正常的树形DP了,,因为看了discuss里面的说的可能有环的情况,就是不知道数据里面有没有换,所以就接受建议直接用邻接矩阵存了。#include#include#include#define maxn 210#define dbug#define M(a) memset((a),0,sizeof((a)))using namespace st原创 2013-05-06 23:29:49 · 1026 阅读 · 2 评论 -
POJ--1661--Help Jimmy--DP
题目链接:戳这里解题报告:先把板子排个序,从高到低的,然后从低到高的依次计算每个板子分别从这个板子的左边落下去的最短时间,和从这个板子右边落下去的最短时间。其实挺简单的,从下往上处理就好了具体思路见代码#include#include#include#include#define INF 99999999#define maxn 1005using namespac原创 2013-05-04 23:36:32 · 439 阅读 · 0 评论 -
POJ --2528--Mayor's posters--离散线段树
没看题目又想看题解的童鞋请先把题目看了。题目给的区间是1到一千万,询问却只有一万个,一千万的数组是开不下的,但是询问的区间比如给了一个,1--100的区间,中间2--99都是浪费掉的了不用的区间,这个题要是能发现这点就好办 了,这也应该是这题的难点,最后采取的办法是离散化的线段树,我最先使用的离散方法是使用的STL里面的SET和MAP,但是比较遗憾的是超时了,然后看了别人博客上的题解代码,借用原创 2013-03-13 21:00:54 · 605 阅读 · 0 评论 -
poj--3928--ping pong
一个树状数组的题目:点击打开链接扫描a[i],用x数组标记曾经出现过的a[i]值,每扫描一个a[i],就更新一次c数组(记录前缀和的数组)。数据结构参考刘汝佳白书#include#include#include#define maxn 100020#define M(a) memset((a),0,sizeof(a))using namespace std;int原创 2013-02-28 12:44:34 · 373 阅读 · 0 评论 -
POJ--2777--Count Color
题目大意:给出一条长为L 的木棍,每次更新一段区间的颜色,颜色范围【1-30】,询问区间内有多少种颜色?成段更新的线段树,终于过去了,,,最先开始我是这样定义线段树的结构体的struct node{ int l,r; int color; //保存区间被涂了的所有颜色信息 };除了一个区间标记外只有一个颜色标记,用颜色是否等于0来代替lazy标记,但是最后发现这样是错滴,因原创 2013-03-06 16:17:32 · 400 阅读 · 0 评论 -
poj--1129
题目大意:给出一个无向图,问最少需要多少种颜色可以给这个图完全染色,要求相邻的两个点颜色不能一样思路:数据小,直接暴力深搜了。注意如果答案是一种颜色的话,输出的字符串里面channel单词后面木有s,表示不细心很坑爹啊有木有!!!#include #include #include #define maxn 30using namespace std;int g[maxn][原创 2013-01-19 13:48:24 · 383 阅读 · 0 评论 -
poj---1111
题目大意:统计一个字符矩阵的X字符的周长题解:简单搜索,当搜索到不是X字符或者到了矩阵外边的时候,判断搜索到这里方向,如果不是通过斜对角来到这个点的就把答案加1,就Ok了#include#include#include#define maxn 40using namespace std;int n,m,x,y;int ans;char g[maxn][maxn];bool原创 2013-01-16 17:24:47 · 293 阅读 · 0 评论 -
poj--1050
给出一个数字矩阵,求出最大子矩阵和朴素的枚举算法复杂度O(n^4),联想到一维的最大子数组问题,枚举矩阵的任意两行,累加竖直方向上的和,得到一个一维数组,计算这个一维数组的最大子数组和,记录答案,这样枚举完以后就得到了最终的答案,时间复杂度O(n^3)。#include#include#include#define maxn 120using namespace std;int原创 2013-01-15 15:14:15 · 333 阅读 · 0 评论 -
poj--1088
求有向图上的最长路径长度。#include#include#define maxn 120using namespace std;int d[maxn][maxn],h[maxn][maxn];int n,m;int dx[]={ 1,-1,0,0};int dy[]={ 0,0,1,-1};int dfs(int x,int y){ if(d[x][y])retu原创 2013-01-15 16:03:10 · 285 阅读 · 0 评论 -
POJ--1054--The Troublesome Frog
题目大意:给出一点矩形,整数坐标上有点,问这些点连成的最长的直线上面有几个点,还要求这些点之间的距离相同,而且直线两端的点的下一个点是在矩阵的外面,解题思路,枚举加剪枝。反思,其实一般的思路都可以想到,剪枝的要求就比较难想,一个枚举题目的重点往往在剪枝上面。#include#include#include#include#define eps 1e-10#define max原创 2013-01-22 11:35:57 · 474 阅读 · 0 评论 -
POJ--1723--SOLDIERS
题目大意:将一个坐标平面上所有坐标为整数的点移动到一条水平直线最少需要移动多少步?注意移动后的X坐标要是整数连续的,这样才确保x'[i]=x[i]-i,当所有点移动完毕时,所有x'[i]==K;题解参考这里#include#include#define maxn 10020using namespace std;int x[maxn],y[maxn],n;int main(){原创 2013-01-05 11:34:59 · 444 阅读 · 0 评论 -
POJ--1694--An Old Stone Game
题目大意:有一棵树,有一个篮子,里面有K颗石子,用石子放在树的叶子节点上,当一个中间节点的直接子节点全部都放着石子的时候,这个中间节点可以放石子,它的直接子节点上面的石子放回到篮子里,可以在后面的过程中使用,问最少需要多少颗(K)石子,可以按照要求的过程最后在根节点上放石子。解题思路,考虑一个中间节点,假设已经求出了它的每个子节点放置石子需要的石子数量,因为数量需要大的子节点先放可以满足后面需原创 2013-01-04 23:06:15 · 634 阅读 · 0 评论 -
POJ--1837--Balance--DP
顶呱呱的题解:点击打开链接#include#include#include#define maxn 30#define flow 7500using namespace std;int f[maxn][maxn];int n,m;int c[maxn],g[maxn];int dp[maxn][15020];void solve(){ dp[0][flow]=1;原创 2013-03-29 12:01:23 · 522 阅读 · 0 评论 -
POJ--1141--Brackets Sequence--记录DP路径
区间DP,然后记录路径,,,貌似类似题目以前做过的,但是忘了。。#include#include#include#define INF 1000000#define maxn 120using namespace std;int d[maxn][maxn];int p[maxn][maxn];char s[maxn];void init(){ memset(d,-原创 2013-03-15 22:21:31 · 536 阅读 · 0 评论 -
POJ --3254--Corn Fields--状态DP
状态DP上手~和炮兵阵地很相似的道理,会了炮兵阵地就会这个了。同样的思路,当前行的状态由上一行的可行状态整合而来,具体思路见代码#include#include#include#define maxn 20#define dbug1#define M 100000000using namespace std;const int maxStatu=1<<13;int bm原创 2013-04-27 17:23:13 · 480 阅读 · 0 评论 -
POJ--1038--Bugs Integrated, Inc.--状态DP
硬着头皮写了两天,下面把思路复述一下:一:状态的表示:对于每一行来说,a[x]={0,1,2};分别表示格点x的上方有{0,1,2}个空格可用。和黑书的不一样,我觉得这样表示比较方便直观一点就这样表示了。然后对于每一行可看做是一个三进制的数字,再把这个三进制数转换成十进制数字,从而实现状态压缩存储的目的。二:dp 数组的表示:dp[i][j] 表示从第i-1行的任意状态得到的第i行原创 2013-04-27 09:40:34 · 560 阅读 · 0 评论 -
POJ --1170 -Shopping Offers--DP
五维DP,蛋碎了,,很久不写题解的我也想记下这段优美的代码了#include#include#include#define maxn 1000using namespace std;int code[6]; //each item's codeint dcode[maxn]; //dcode[code]=indexint num[6]; //each item's number原创 2013-04-23 17:04:59 · 495 阅读 · 0 评论