POJ
文章平均质量分 76
njlcazl
这个作者很懒,什么都没留下…
展开
-
【poj1637】【最大流】Sightseeing tour
这道题是一个混合图欧拉回路问题。建图方法:将无向图随意定向,计算每个点的入度和出度,令calc[i] =abs(in[i] - out[i])/2。如果calc[i]为奇数,那么肯定不存在欧拉回路;如果所有点calc[i]都为偶数,那么先将有向边删去,然后按照一开始的定向方法构图,并且对于每个入度小于出度的点则添加一条源点到该点的边,容量为calc[i];反之则连一条该点到汇点的边,容量为原创 2013-03-04 21:44:37 · 418 阅读 · 0 评论 -
【poj3580】【splay】SuperMemo
做过维护数列那道题后这道题做起来好多了。主要说一下REVOLVE操作,要求把[l,r]这个区间的数向后循环t次,其实这个操作相当交换[l,r - t]与[r - x + 1,r]这两个区间,不过操作的时候注意要把t先对区间长度取模。其他的操作就比较简单,类似维护数列。代码:#include#include#define keyTree ch[ch[root][1]][0]原创 2013-04-24 08:56:10 · 634 阅读 · 0 评论 -
【poj2777】【线段树】Count Color
非常水的线段树了吧,注意到最多只有30种颜色,所以我们可以对线段树的每一个节点用一个数来表示这个节点有哪些颜色,最后直接用位运算统计。需要注意的地方:1、一开始所有的颜色都为12、有可能出现a > b的情况代码:#include#include#define lson l,m,rt << 1#define rson m + 1,r,rt << 1 | 1using na原创 2013-04-23 09:04:08 · 591 阅读 · 0 评论 -
【poj2155】【二维数状数组】Matrix
楼教主出的题,先orz下。这道题是修改区间询问点的题,由于二维线段树编程复杂度高,所以可以考虑用二维的数状数组实现,使用C数组来记录翻转次数,查询的时候mod 2即为当前的数,更新的话需要将(x2,y2),(x1-1,y2),(x2,y1 - 1),(x1 - 1,y1 - 1)这四个矩形区域翻转,最后只有(x1,y1)->(x2,y2)这个矩形取反次数为奇数次,其余为偶数次,这样就实现了原创 2013-03-23 10:08:49 · 486 阅读 · 0 评论 -
【poj3281】【最大流】Dining
一道最大流的简单题。将食物和饮料分别看成一个点集,食物放在左边(记为f[i]),饮料放在右边(记为d[i])。然后将每头牛拆成两个点k,k'然后开始建图:1、对于每头牛喜欢的食物和饮料:添加edge(f[i],k,1),edge(d[i],k',1),edge(k,k',1),这样做的目的是为了限制每头牛只能享用一种食物和饮料。2、对于每个食物和饮料:添加edge(s,f[i],1原创 2013-03-20 21:59:58 · 578 阅读 · 0 评论 -
【poj3667】【线段树】Hotel
关于区间合并的线段树。要求的是满足一个条件的最左边的位置。所以可以维护一个sum,suml,sumr分别表示一段区间内空房间的数目,从最左边开始的数目,以及从最右边开始的数目,在pushup的时候需要对区间进行合并,这样在考虑询问的时候,根据维护的信息,优先考虑左边房间就行了。代码:#include#include#define lson l,m,rt << 1#define原创 2013-03-21 11:30:20 · 561 阅读 · 0 评论 -
【poj2778】【AC自动机】【DFA】【矩阵乘法】DNA Sequence
求长度为n的串中不包含模式串的串的数目首先将模式串建成AC自动机,将模式串标记,这里需要注意的是,如果一个节点的失败指针也指向了一个模式串,那么该节点也需要被标记。建好AC自动机后,我们就建立了转化关系,然后我们就可以使用DP的方式计算答案。考虑到n的范围很大,所以我们将所有不包含模式串的转化关系构建一个矩阵,使用矩阵快速幂求出长度为n的串的方案数,最后累加即可。#include原创 2013-04-02 10:33:01 · 698 阅读 · 0 评论 -
【poj3177】【双连通分量】Redundant Paths
题目大意是:给定一个连通图,要求添加一些边,使每两个顶点之间都有至少两条不相交的路径,求最小需要添加的边数。这题是看了byvoid的题解才会的。首先dfs出所有的桥,然后删除这些桥,将剩下的子图收缩为一个点,这样就得到了一棵树,然后统计树中度数为1的点,记为leaf,若leaf=1,则为一个连通分量,否则答案为(leaf+1)/2这个公式的解释:“简单说明一下,首先把两个最近公共祖先最原创 2013-03-17 20:31:48 · 631 阅读 · 0 评论 -
【poj2195】【二分图最佳匹配】Going Home
题意:给定一张地图,其中有人和房子,人每移动一个格子需要1个单位花费,求令所有人都到房子里去的最小花费。KM的模板题。建立一个二分图,人在左边,房子在右边,对于每个人,和所有房子连边,权值为负的曼哈顿距离(因为KM求的是最大权和),然后一次KM,再将答案取相反数就行了。代码:#include#includeusing namespace std;const int inf = 0原创 2013-03-17 14:27:11 · 536 阅读 · 0 评论 -
【poj2391】【最大流】Ombrophobic Bovines
这道题可以转换为网络流判定性问题。首先二分出一个最短时间mtime,然后将图中的每个点拆为两个,令a[i]为当前牛的数量,b[i]为容纳最大牛的数量,len[a][b]为点a到点b的最短距离,tot为牛的总数。首先floyd求出两点间的最短距离,然后对于每一个点,连边(s,i,a[i]),(i,t,b[i]),(i,i + n,∞)然后若len[i][j] ime,连一条(i,j +原创 2013-03-15 22:02:43 · 518 阅读 · 0 评论 -
【poj1187】【最大流】PIGS
经典的最大流模型,按照下列规则建出网络图,然后做一次最大流即可。• 每个顾客分别用一个结点来表示。• 对于每个猪圈的第一个顾客,从源点向他连一条边,容量就是该猪圈里的猪的初始数量。如果从源点到一名顾客有多条边,则可以把它们合并成一条,容量相加。• 对于每个猪圈,假设有 n 个顾客打开过它,则对所有整数 i∈[1, n),从该猪圈的第 i 个顾客向第 i + 1 个顾客连一条边,容量为∞原创 2013-02-28 21:01:17 · 570 阅读 · 1 评论 -
【poj3237】【link-cut tree】Tree
题目大意:给你一颗树,要求支持下列3个操作: 1.询问两点之间路径的边中边权最大的; 2.把两点之间的路径的边权全部取反; 3.修改某条边的边权。很明显的动态树模型,首先要把边权转化为点权,并且要在dfs的时候记录每条边的权值在哪个点里面。操作1和3是常规操作。对于操作2,我们对每个节点记录Max和Min,取反就等价于Max = -Min,M原创 2013-05-13 07:55:14 · 767 阅读 · 0 评论