
POJ解题报告
hanhansoul
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
poj3468 A Simple Problem with Integers
/* * poj3468 AC * 线段树的基本操作(注意输出要用long long) * 区间增减+区间查询 * * 不同于单点增减,区间增减并非立刻更新当前区间,而依赖于"懒惰标记"的运用。 * 中心思想: * 在更新时,只要某个结点的区间完全属于增减区间,则更新当前结点,并做上标记, * 表示当前结点的信息是可靠的,之后退出而不更新儿子结点。 * 在查询时,原创 2012-05-28 14:02:03 · 335 阅读 · 0 评论 -
poj3422 Kaka's Matrix Travels
/* * poj3422 AC * 网络流 最小费用最大流 * 图的模型 * 每个方格拆成两个节点u和v,用两条边连接,一条容量为1,费用为方格数字的相反数; * 另一条边容量为k-1,费用为0。 * 每个方格的v节点与左边和下面方格的u节点相连,容量为k,费用为0。 * 创建源点s与汇点t,s与第一个方格的u节点相连,容量为k,费用为0。 * 最后一个方格的v节点与t相连,容量为原创 2012-12-08 11:56:58 · 498 阅读 · 0 评论 -
poj1112 Team Them Up!
/* * poj1112 AC * DP 背包问题 与poj1636 prison rearrangement如出一辙。 * 问题挺经典,重点在于构造模型。 * 首先考虑将所有人分为互斥的若干部分,这便是背包问题中物品了。 * 之后,要将每个"物品"分为放在A和放在B的两个部分,然后进行DP。 * * I. 求补图,将表示两个人相互认识的边去除,连接所有互相不认识, * 或单原创 2012-09-17 20:11:51 · 557 阅读 · 0 评论 -
poj1180 Batch Scheduling
/* * poj1180 AC * 动态规划+斜率优化+单调队列 * 注意边界的处理,由于STL的问题导致浪费了很多时间。 * 状态方程巧妙,逆序的方式很有效。 * * 方程的变化十分巧妙。 * 之前的方程: * dp[i][j] 表示前i的工作分成j组的最小花费。 * f[i]表示前i个工作的费用系数和。 * t[i]表示前i个工作的时间总和。 * dp[i][j] = m原创 2012-08-02 10:25:00 · 710 阅读 · 0 评论 -
poj2228 Naptime
/* * poj2228 AC * DP+滚动数组 * 方程开始就想错了,看了题解才知道差了十万八千里。 * 值得研究的一道题。 * * f[i][j][0..1]表示前i段时间,休息j段时间,且第i段时间 * 在不休息(0)或休息(1)时的最大值。 * * f[i][j][0] = max(f[i-1][j][1],f[i-1][j][0]); * f[i][j][1] =原创 2012-07-20 10:34:54 · 756 阅读 · 0 评论 -
poj2342 Anniversary party
/* * poj2342 AC * 典型的树状DP。 * dp[i][0]表示员工i参加舞会的最大值,dp[i][1]表示员工i不参加舞会的最大值。 * * dp[i][0] = max(dfs(son[i],1)); * i参加则i的儿子结点一定不能参加。 * dp[i][1] = max(dfs(son[i],0),dfs(son[i],1)); * i不参加则i的儿子结点可参原创 2012-07-19 13:12:18 · 789 阅读 · 0 评论 -
poj2374 Fence Obstacle Course
/* * poj2374 AC * 线段树+DP 这道题还是很典型的,值得一做。 * * */ #include #include #define MAXN 200005 using namespace std; long tree[MAXN<<2]; long a[50005],b[50005]; long f[50000][2]; long query(long k,long原创 2012-07-18 17:02:18 · 639 阅读 · 0 评论 -
poj2378 Tree Cutting
/* * poj2378 AC * 一次水过。 * 简单的树状DP,先做一次dfs算出每个结点的子孙结点总数,包括自己,sum[i]。 * 再做dfs计算删去每个结点x是否满足条件,即满足: * 1) 每个结点的所有子结点i的sum[i]是否小于half。 * 2) 父结点方向上的结点总数,sum[1]-sum[x]是否小于half(1为树的根结点)。 * 若满足则为原创 2012-07-18 19:50:33 · 531 阅读 · 0 评论 -
poj1949 chores
/* * poj1949 AC 看起来像拓扑排序的DP * * 关键在于:工作k的前趋在1..k-1进行选择。 * 所以,理解题意可知,令工作i的结束时间为dp[i] * dp[i] = max(dp[j]|工作j为i的前趋)+t[i]; * * 但即使没有此条件,也可以将此题看作是一道树状DP。 * 将拓扑图反向,即将某工作的前趋作为该工作的儿子进行DP。 * 但我的树状DP原创 2012-07-15 18:11:28 · 917 阅读 · 0 评论 -
poj2777 Count Color
/* * poj2777 AC * 线段树基础 * 注意:初始状态时board已经染为了颜色1 * 看到颜色只有30种时,果断想到了用二进制数来保存颜色,一个long足够了。 * * 线段树: * 线段树的基本操作参考AHYY的线段树讲稿。 * 现在终于注意到了队结点标记的重要性,即要保持结点的一致性。 * * 一致性: *原创 2012-05-26 13:16:07 · 387 阅读 · 0 评论 -
poj3621 Sightseeing Cows
相关题解参见这里,这一类问题这里都讲到了,很全面。 /* * poj3621 AC 625ms * 所谓的01分数规划+spfa判断正(负)环+二分枚举答案 * 为什么就那么慢,那个pascal的0ms是直接打印的答案吧,快得逆天了啊! * 经常会纠结这种问题: * 对一个任务选择一种方案,存在不同的价值与成本,要求(价值/成本)最大的方案。 *原创 2012-05-21 13:04:19 · 620 阅读 · 0 评论 -
poj3463 Sightseeing
/* * poj3463 AC * 求最短路径以及次短路径的总数。 * Dijkstra+一点变化。 * 与最短路径的Dijkstra的相比,记录的东西要增加。 * 算法: * 首先,要记录到某结点的最短路径以及最短路径dis[i][2], * 记录到某结点的最短路径以及次短路径是否算出的vis[i][2], * 还要记录到大某结点的最短路径以及次短路径的路径数num[i][[2原创 2012-05-18 17:15:40 · 540 阅读 · 0 评论 -
poj2449 Remmarguts' Date
典型的求k短路径的问题,有很多种算法,暂时试了试Dijkstra+A*算法 k短路径的相关问题看这里,尽管已经是2007年的文章了,但作者真的写得非常详细和全面。 下面是一个简化的算法流程。 /* * k短路径 Dijkstra+A*算法 * 算法流程: * 1.将有向图的边反向后,Dijkstra求出任意节点到终点的最短路径 dis[i] * 2.优先队列 * struct原创 2012-05-16 21:20:18 · 584 阅读 · 0 评论 -
poj1151 Atlantis
此处的讲解更加详细与系统,代码也要好看100倍。 /* * poj1151 AC * 线段树+线段扫描+矩形分割 * 计算平面上重叠矩形的总面积的经典问题 * * 代码又长又丑,完全不能忍了。 * * 实数坐标需要离散化,并且需要一个简单的hash数组对应 * 分割方式有两种,纵向与横向,此处采用纵向分割。 * 构造线段树时,注意其区间此处取[l,r)更为方便合适。 * 初始原创 2012-06-02 21:01:47 · 556 阅读 · 0 评论 -
poj1144 Network
标准的求割顶的问题,用tarjan算法,参见www.nocow.cn割点词条 /* * poj1144 AC * 求无向图割顶 * tarjan算法,好好背一背! * */ #include #include #include #include using namespace std; struct NODE{ int v,next; }edge[20020]; long tot,he原创 2012-05-10 01:32:12 · 447 阅读 · 0 评论 -
poj1639 Picnic Planning
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include原创 2013-04-02 22:51:48 · 526 阅读 · 0 评论