自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(30)
  • 资源 (1)
  • 收藏
  • 关注

原创 poj 3042 Grazing on the Run

这个题目原型应该是吃完所有的草丛的最小时间,现在变成了每个草丛被吃的时间和,貌似如果还是按照原来的dp方法dp[i][j]表示吃完i到j的草丛的花掉的时间的话,有两个因素会影响后面的决策,一个是花掉的时间,一个是吃掉的草丛的时间累加和。但是仔细观察这个问题会发现,第一个走的距离,会被计算n次,第二个走的距离,会被计算n-1次。如果我们把这个代价转移到该草丛上的话。那么dp[i][j]表示转移后

2013-10-31 23:51:32 1067

原创 hdu 4494 Teamwork 网络流

网上比较多的代码都是用费用流做的,但是这个题目简单的描述就是求最小路径覆盖,每个点覆盖的次数不是1了而已。简单修改求最小路径覆盖的方法即可,源点向顶点,顶点向汇点连的边都变成点需要被覆盖的次数即可。#include #include #include using namespace std;const int maxn=15e1+9,inf=1e9;int n,m;int su

2013-10-28 22:45:32 1016

原创 poj 2446 网络流

先黑白染色,然后每个覆盖必须覆盖一个黑点一个白点,那么就是一个二分图,一个覆盖就是一次匹配,那么就求一下最大匹配就好了。#include #include #include using namespace std;const int maxn=1100,inf=1e9;int n,m,k;int flag[35][35];int level[maxn],que[maxn];

2013-10-27 22:25:40 654

原创 poj 3308 Paratroopers 网络流

由于最后结果是相乘,所以先log一下,转化成想加。然后点做边,行,列做点。最小权覆盖。#include #include #include #include using namespace std;const int maxn=2e2+9;const double inf=1e20,epx=1e-4;int que[maxn],level[maxn];int head[

2013-10-27 21:45:44 728

原创 poj 3281 网络流

经典题目,拆点网络流。#include #include #include using namespace std;const int maxn=4e2+9,inf=1e9;int n,f,d;int level[maxn],que[maxn];int head[maxn],lon;struct{ int next,to,c;}e[maxn*maxn<<1];

2013-10-27 16:56:16 712

原创 poj 2699 The Maximum Number of Strong Kings 网络流

#include #include #include using namespace std;const int maxn=19;int a[maxn],e[70][70],flag[maxn];int n;void makegraph(){ memset(e,0,sizeof(e)); int ret=0; for(int i=1;i<=n;i++)

2013-10-27 16:37:30 794

原创 poj 2391 Ombrophobic Bovines 网络流

二分答案+网络流判定,一定得拆点。#include #include #include #include using namespace std;const int maxn=2e2+9,inf=1e9;long long d[maxn][maxn];int n,m,sum;int level[maxn<<1],que[maxn<<1];int head[maxn<<1],l

2013-10-27 16:29:08 713

原创 poj 1637 Sightseeing tour 网络流

经典题目,很多书上都有解答。首先得用一个结论,一个联通的有向图存在欧拉回路当且仅当每个点的入度等于出度。那么这个题目的做法就是先给无向边任意定向,然后源点向入度大于出度的点连边,出度大于入度的向汇点连边,网络流判断能不能使得最后每个点的入度都等于出度。#include #include #include using namespace std;const int maxn=

2013-10-27 12:19:40 763

原创 poj 2125 Destroying The Graph

最小点权覆盖加输出路径。#include #include #include using namespace std;const int maxn=3e3+9,inf=2e9;int in[maxn],out[maxn];int S,T,level[maxn],que[maxn];bool visit[maxn];int n,m;int head[maxn],lon;s

2013-10-26 21:06:17 676

原创 poj 3155 Hard Life 分数规划+最大权闭合图

这个就是完全按照论文中的做法来搞了,输出割边的时候就dfs判断一下在残余网络中该点是否可达汇点,不可达则是割边。当然这么做还有一个前提就是最大全闭合图是唯一的,所以不会存在不同的割边集。#include #include #include using namespace std;const int maxn=1e2+9,inf=1e9;const double epx=1e-

2013-10-25 23:54:27 913

原创 poj 3084 最小割

简单的求最小割 不知道为什么这么少人A#include #include #include #include using namespace std;const int maxn=30,inf=1e6;int n,m;int level[maxn],que[maxn];int head[maxn],lon;struct{ int next,to,c;}e[ma

2013-10-24 20:57:13 624

原创 poj 2396 Budget 有上下界的网络流

对上下界网络流的解法很多地方有,就不再叙述了,说说自己的理解,网络流的算法能解决分配的问题,而上下界网络流的不同在于下界必须流满,所以做法就是先用网络流算法把下界流满,然后转化成普通网络流算法解决。#include #include #include using namespace std;const int maxn=2e2+9,inf=1e9,N=10000,M=1000;i

2013-10-23 23:11:55 756

原创 poj 1815 Friendship 网络流

求最小割就没什么可说的了。关键是怎么判断一条边能不能成为割边,如果能够成为割边,那么做完最大流之后,起点肯定不能达到终点,否则这条边容量减小对最大流没有影响。那么怎么去掉这条边呢?反向压一次流。#include #include #include using namespace std;const int maxn=4e2+9,inf=1e7;int n,s,t;int d[m

2013-10-23 00:13:50 928

原创 poj 2992 Divisors 简单数论

统计出质因数的个数,然后乘一下就可以了。但是数据量非常巨大,预处理出连续段的质因数的个数。#include #include #include using namespace std;const int maxn=500;int cnt[maxn][maxn];int n,m;void cal(int t,int tmp){ int tt=t; for(

2013-10-22 20:12:32 882

原创 hdu 4427 Math Magic dp

长春现场赛的题目,dp[i][j][k]表示公倍数为i,和为j,用了k个数的方法数。但是状态太多,注意到只有m的约数的公倍数才有可能是m,那么可以预处理出m的所以约数,然后只遍历这些状态,再稍微优化一下常数就可以过了。#include #include #include #include #include using namespace std;const int maxn

2013-10-22 11:52:22 916

原创 poj 3680 Intervals 费用流

#include #include #include #include using namespace std;const int maxn=1e3+9,inf=1e8;int from[maxn],to[maxn],w[maxn],x[maxn];int head[maxn],lon;int dist[maxn],inque[maxn],que[1111111];int T,n

2013-10-20 23:42:46 975

原创 poj 2376 Cleaning Shifts 贪心

每次选择开头被覆盖的最大的值#include #include #include using namespace std;const int maxn=1e6+9;int dp[maxn];int main(){ int n,t; while(scanf("%d %d",&n,&t)!=EOF) { memset(dp,0,sizeof

2013-10-16 23:54:11 769

原创 poj 1639 Picnic Planning

有度限制的最小生成树。解法网上很多,就不再叙述了。#include #include #include using namespace std;const int maxn=1e2+9,inf=5e7;char a[maxn][maxn];int n,m,limit;int head[maxn],lon,visit[maxn],dist[maxn],distfrom[maxn

2013-10-15 22:14:39 707

原创 poj 1904 King's Quest tarjan求二分图的所有可选最大匹配边

因为是完美匹配,所以每个点都已经匹配了,那么如果要选择一条别的边,增光路的最后必定找到原来所匹配的点,加上匹配的边,那么就是一个环。所以可选边在一个强连通分量里。#include #include #include using namespace std;const int maxn=4e3+9;int mt[maxn];int low[maxn],dfn[maxn],inst

2013-10-12 23:45:09 798

原创 poj 2226 二分图匹配

这个题目容易想到dp,dfs,dp状态太多,dfs会tle。那么就只能往图论上面想了,注意到一个事实,任何一个格子只能被两个木板覆盖。而且是一个横着放的木板,一个竖着放的木板,那么所有横着的木板都看成x集合的点,竖着放的点都看成y集合的点。而格子看成边,那么这就是一个二分图求最小覆盖的问题了。上代码#include #include #include using namesp

2013-10-12 19:18:11 677

原创 hdu 4742 Pinball Game 3D 分治+树状数组

离散化x然后用树状数组解决,排序y然后分治解决,z在分治的时候排序解决。具体:先对y排序,solve(l,r)分成solve(l,mid),solve(mid+1,r), 然后因为是按照y排序,所以l,mid区间内的y值都小于mid+1,r。现在再对z排序,按照顺序以x做关键字插入到树状数组中,那么就可以一起解决l,mid对mid+1,r的影响。#include #include

2013-10-08 21:10:56 1191

原创 Codeforces Round #204 (Div. 1) C Jeff and Brackets dp+矩阵加速

比赛的时候没做出来,时间不够,我想到的方法是先求出dp[i][j]在前面有i个左括号的情况下填完n个括号后的最优解。后面的m次就可以用矩阵加速来做了。#include #include #include using namespace std;const int maxn=22;int n,m;int a[maxn],b[maxn];long long dp[maxn][

2013-10-08 10:37:10 1240

原创 poj 3714 Raid 分治

先按横坐标排序,然后分治,合并的时候只需要处理两边x坐标差在d范围内的点即可。把这些点找出来之后,再按照y值排序,然后再检查y坐标差在d以内的点,那么可以保证每个点最多检查6个点(否则这些点之间必定存在距离小于d的点对),那么可以保证o(n)的合并。总的复杂度nlognlogn。#include #include #include #include #include usi

2013-10-07 16:18:54 803

原创 hdu 4757 Tree 南京网络赛 1010

可持久化字典树,每个节点存一棵根节点到它的节点构成的字典树,利用父节点的信息来构树。查询的时候通过最近公共祖先,查询的两个点,三个点的共同信息可以得到两点路径除公共祖先外的点构成的字典树的情况,从而得出最优解。#include #include #include using namespace std;const int maxn=1e5+9,maxm=2e6;int a[max

2013-10-07 13:00:00 1433 1

原创 hdu 4348 可持久化线段树

查询历史状态,在线做的话就要用可持久化数据结构,所谓可持久化,意思就是保存所有的历史状态,但是因为每次修改只涉及到logn个节点,所以每次只新建logn个节点。其余节点及可利用历史版本的。但是这个题目如果用lazy的话,因为每次查询会下放lazy,导致必须新建节点,最后会造成mle。所以用维护两个值来实现最后的结果。#include #include #include usin

2013-10-06 17:56:19 1159

原创 poj 3182 The Grove bfs

思路:如果要围绕一圈,必须经过一条竖线上的一点,把竖线左端封住,bfs一次,枚举点,再把竖线右端封住,再bfs回起点。#include #include #include using namespace std;const int maxn=5e1+9,inf=1e9;char a[maxn][maxn],now[maxn][maxn];int dist[maxn][maxn]

2013-10-05 14:24:25 849

原创 poj 3168 Barn Expansion 排序

把每个横坐标边,纵坐标边分别排序,判断是否相邻即可。#include #include #include #include using namespace std;const int maxn=25e3+9;int n;bool use[maxn];struct{ int a,b,c,d;}data[maxn];struct A{ int key,d

2013-10-04 19:25:27 1246

原创 poj 3184 dp

优化常数即可#include #include #include #include using namespace std;const int maxl=1e6+9,maxn=1e3+9;int dp[maxl],que[maxl],top,front;int n,m,l,r;bool use[maxl];struct D{ int l,r; bool

2013-10-04 16:35:24 925

原创 poj 2373 单调队列优化dp

单调队列优化dp#include #include #include #include using namespace std;const int maxl=1e6+9,maxn=1e3+9;int dp[maxl],que[maxl],top,front;int n,m,l,r;bool use[maxl];struct D{ int l,r; b

2013-10-04 16:34:28 862

原创 poj 3167 Cow Patterns kmp

两个串匹配的话意思就是每一位对应的排序序号相等。即比它大比它小的数目对应相同。那么就可以用kmp来做了,匹配的时候相等的条件改成判断两个位置的数字排序位是否相等。#include #include #include using namespace std;const int maxn=1e5+9;int a[maxn],b[maxn],cnt[maxn/4][30],next

2013-10-03 23:41:33 1020

poj 3947 题解

经典O(n)求最长回文 acmer新手可看

2013-09-24

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除