自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

老臣

有时,我可能脆弱得一句话就泪流满面,有时,也发现自己咬着牙走了很长的路。

  • 博客(72)
  • 收藏
  • 关注

转载 二分图大讲堂——彻底搞定最大匹配数(最小覆盖数)、最大独立数、最小路径覆盖、带权最优匹配

文本内容框架: §1图论点、边集和二分图的相关概念和性质 §2二分图最大匹配求解 匈牙利算法、Hopcroft-Karp算法 §3二分图最小覆盖集和最大独立集的构造 §4二分图最小路径覆盖求解 §5二分图带权最优匹配求解 Kuhn-Munkers算法 §6小结 每章节都详细地讲解了问题介绍,算法原理和分

2017-07-31 15:50:23 1005

原创 bzoj2718/1143 CTSC2008 祭祀 最长反链

经典题来着。。 其实就是求最长反链。 然后我们有Dilworth定理: 1.最长链=最长反链覆盖 2.最长反链=最长链覆盖 第一个我还没见过,等一下去查一查。第二个就是我们要用到的了。 证明http://vfleaking.blog.163.com/blog/static/1748076342012918105514527/ 那么最长链覆盖=N-最大匹配。 那么很显然了,直接连边跑最

2017-07-31 15:34:21 292

原创 bzoj2756[SCOI2012]奇怪的游戏 二分 分类讨论 最大流

细节比较多的一道题目。 题意:给你一个矩阵,每次能把相邻的两个数都+1,问你最少多少次能把整个矩阵的数都变成同一个数。 网络流的模型比较明显,但是正解的话考场上可能不容易想到= =。 先把整个网格图黑白染色,设格子数和总和分别为num1,sum1,num2,sum2. 那么假设最终变成了X,那么最后的答案肯定是X*num1-sum1,即添加了多少次。 然后我们分类讨论。 num1!=nu

2017-07-30 20:50:38 234

原创 bzoj2391Cirno的忧郁 treap+三角剖分

好强啊这题,只能%题解。 因为题目中不存在三点共线的情况先设p0(-10000,-10000),然后将其他点极角排序(如果用最左下的点后面计算时还需要特殊处理)f[i][j]表示0,i,j这个三角形内的点数,ij为排序后的标号这一步可以预处理,做法是对于每个i建一棵平衡树,将排在它以后的j逐个加入平衡树,平衡树的关键字为i为基点的极角,可以发现j在平衡树中的排名就是三角形内部的点数+1然后将三角形

2017-07-30 19:38:47 409

原创 bzoj3170&&jzoj3256 【TJOI2013】松鼠聚会 切比雪夫距离

是个概念题。 题目中的距离其实就是切比雪夫距离,把横坐标变为x-y,纵坐标变为x+y以后直接用前缀后缀和统计一下就好了。#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int

2017-07-28 22:28:03 288

原创 bzoj4080 Wf2014 Sensor Network 随机化

题意:给你一个点集,让你选出最多的点同时保证任意两个点之间距离不能超过d。 一开始一看见n<=100以为直接暴力加入,然后每一次在已经加入的里面比较,结果WA了。。其实挺明显的,肯定不是最优的啊= =,要保证正确性只能2^100。。。 所以就懵逼了,题解是随机化一个序列以后贪心来,感觉整个人都不好了。。还有这种选学算法= =#include<cstdio>#include<algorithm>

2017-07-28 12:25:11 272

原创 bzoj4484[Jsoi2015]最小表示 拓补排序+bitset

挺显然的吧,一条边没有影响当且仅当这个边相连的两个点已经可以互相到达,就是没想到用bitset维护,老纠结map。。。#include<cstdio>#include<algorithm>#include<cstring>#include<bitset>#include<queue>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,

2017-07-28 10:02:17 268

原创 bzoj3196 Tyvj 1730 二逼平衡树 线段树套treap

裸的树套树,其实本来是想练习treap,后来想想算了,顺手学一波咯,反正是入门题。 t[k].s表示子树大小,t[k].w表示k这个点含有多少相同的数。#include<cstdio>#include<algorithm>#include<cstring>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a

2017-07-27 16:56:33 417

原创 bzoj1691 [Usaco2007 Dec]挑剔的美食家 treap+贪心

比较明显的贪心吧,按照鲜嫩值排个序,从大到小,然后每次只加入比当前鲜嫩值大的,直接查找就好了,找到以后就删掉。#include<cstdio>#include<algorithm>#include<cstring>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using names

2017-07-27 15:39:38 269

原创 bzoj1588[HNOI2002]营业额统计 treap

Description营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。 Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营业情况是一项相当复杂的工作。由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况

2017-07-27 10:00:52 236

原创 bzoj1862&&1056 GameZ游戏排名系统 treap+哈希表

居然只是隔了就拿来当原题,这样真的好吗=。= 平衡树直接硬上,然后用哈希表存一下名字,其余的话就是裸操作了,要注意的是要加上一个时间标记,不然删的时候会炸。。 时间标记有几个地方忘记加上结果T了半天= =。 码了1个小时多,手酸了都= =4400B#include<cstdio>#include<algorithm>#include<cstring>#include<cstdlib>u

2017-07-26 17:09:06 301

原创 bzoj1503[NOI2004]郁闷的出纳员 treap

换个打法,以前一直用指针,现在觉得太麻烦,借鉴ymwdalao的模板。#include<iostream>#include<cstdio>#include<ctime>#include<cstdlib>using namespace std;struct leaf{ int k,s,l,r,num;};int n,m,delta=0,size=0,root=0,tot=0;le

2017-07-26 11:55:19 365

原创 bzoj3545[ONTAK2010]Peaks 线段树合并+离散

一开始以为是什么没见过的点分治姿势,后来发现不对,肯定要数据结构维护,那难道是树剖?不可能啊这怎么维护= =,在ymw大神的提醒下突然想到线段树合并= =。。 先离散,然后对每一个联通块建一颗线段树(动态开点),然后按照边的从小到大排序,询问也按照那个限制从小到大排序,然后离线,按照题目要求每次把小于当前限制的并查集合并一下,同时线段树合并,然后直接在线段树内寻找k大就可以了,如果区间内的数#in

2017-07-26 08:58:56 309

原创 bzoj2683&&1176[Balkan2007]Mokia cdq分治

应该算是入门题,只不过我很久没做这种矩形题了,所以没有想到一个关键点导致我模型没转化过来。 还是像之前一样把询问和赋值多添加一个维,表示时间,然后添加很显然就不说了,每次直接bit加入就好,问题是查询。 一个子矩阵x1 y1 x2 y2 的答案等于ans[x2][y2]+ans[x1][y1]-ans[x1][y2]-ans[x2][y1] 注意一下边界就好了,然后直接cdq。 %GEOTC

2017-07-25 21:15:28 269

原创 bzoj3209 花神的数论题 数位DP

一开始想的是先预处理出n位的答案,因为假设当前给出的数x有y位,那么y-1位的答案是固定的,我只要处理y位的答案就可以了,问题是这样太复杂。。。 设f[i][j]表示i位有j个1的答案,那么明显有f[i][j]=f[i-1][j]+f[i-1][j-1],表示第i位选0或1. 然后最后统计一下答案,就是每一种出现了多少次。。其实挺简单的,基本想出来了,但是数位dp不熟,想的复杂了。#includ

2017-07-25 16:12:54 282

原创 bzoj3597 [Scoi2014]方伯伯运椰子 01分数规划

题意:给你一个满流的残量网络,让你通过调整以后,使得调整前后的平均费用之差(调整后比调整前小)最大,同时要求调整后仍然满流。 其实这题不难,只不过网上的题解大多数都模棱两可,写法也参差不一,搞得我很蛋疼。。 事实上我们可以发现,当前给我们的图肯定不是最小流,否则无法增广。 然后,根据费用流的消圈定理,我们只用增广一个负环就好了,所以用01分数规划一下,然后spfa判断是否有负环。根据01分数规

2017-07-25 10:53:41 304

原创 bzoj3522 [Poi2014]Hotel dfs(DP)

其实这题勉强可以算是个DP= = 一开始想的是设f[i][j]表示以i为根,距离为j的答案,然后发现转移好像很复杂,写出来了但是MLE= =。。懒得开滚动了。 然后发现其实并不用这么复杂= = %题解: 首先可以发现,满足条件的点对一定是“有一个中心点,三个点到中心点的距离相等,且三个点分别在不同子树中”这种情况。 那么枚举中心点,然后遍历子树,统计答案。 cnt[i]为临时数组,表示当

2017-07-25 08:59:24 340

原创 bzoj3990 [SDOI2015]排序 dfs

考试遇见这种题目只能傻眼。。 题目大意:给定一个长度为2^n的排列,有n个操作,第i个操作为【将序列分成2^(n-i+1)段,每段长2^(i-1),然后任选两段交换】,每个操作最多用一次,求有多少操作序列能把序列排出来 (orz popoqqq)orz hzwer: 我们可以发现一个操作序列如果改换顺序,结果不变,所以我们只要找到一种以后把答案加上这个操作序列的阶乘就好了。 我们从小到大DF

2017-07-24 22:23:45 296

原创 bzoj3295[Cqoi2011]动态逆序对 cdq分治(树套树/主席树)

这题应该挺老了吧,好多人都切了,各种姿势都有,cdq分治是比较简单的一种,我就打了。。 跟普通的偏序不同,这里有一个删除的操作,那么我们其实可以把删除看作倒着插入,然后对被删除的哪一个数标记一下被删除的时间,然后对序列中的每一个数加上一维限制t,表示时间,那么明显对于未删除的,他们的时间按顺序递增,否则就从n递减,因为第一个删除就是最后一个插入。 然后就是三维偏序裸题了,注意一下要正反各扫1遍,

2017-07-24 20:54:44 301

原创 bzoj3262陌上花开 cdq分治 三维偏序

cdq分治的入门题目,学习一下这个很实用的玩意儿。 大概思想就是把在线变为离线,去掉时间的限制,然后每次对于询问区间分治处理,块内之间的影响可以递归处理,然后剩下的就是块与块之间的影响,这个其实就很简单了,随便搞搞就好,反正是静态查询,双指针啊啥的随便上。。 这题的话第一维排序,第二维cdq,第三维树状数组。 直接做就好啦。#include<cstdio>#include<algorithm

2017-07-24 16:35:18 303

原创 bzoj3998 [TJOI2015]弦论 后缀自动机

经典的求k小子串的问题。 根据right集合的定义,如果是相同子串不同位置算作一个,那每一个right集合对应的左右区间长度的大小就是这个right集合所包含的不同子串个数。 但是知道了这个并不代表我们可以直接求出来= =因为你并不知道k小是right集合中的哪一个,也就是说你没有办法准确的用尽量小的复杂度去把这个K小的子串拿出来,所以我们只能在dag上搞事情。。设sum[i]表示以i为根时子树

2017-07-24 10:36:11 209

原创 bzoj3926[Zjoi2015]诸神眷顾的幻想乡 广义后缀自动机

广义后缀自动机裸题,具体可以参考15年国家队论文。 其实就是在trie上建SAM,一边dfs一边建就可以了。#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>

2017-07-23 17:26:58 229

原创 bzoj2946 [Poi2000]公共串 后缀自动机

原来2000年就有SAM了,害怕 先对第一个串建一个SAM,然后把其他串在上面匹配,得出每个状态的最大匹配长度,然后对每个状态取所有串的最小值,这就是最长公共子串,然后对所有子串求个mx就好了。#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>#define fo(i,a,b) for(int i=a

2017-07-23 10:51:34 332

原创 bzoj3430 [Usaco2014 Jan]Ski Course Rating 并查集+bfs

这题正解脑洞有点大。。一开始并没有想到正解,只是会二分暴力= = 后来膜了一发题解发现原来还有人二分+可持久化并查集做的,不过这是针对t不同的情况下= =以后可以出个题祸害社会 正解是先把任意两点之间连边,记录一下出发点和到达点,然后按照边的大小排序,从小到大做,每一次用并查集将可以互通的两块联合在一起,直接计算贡献。。#include<cstdio>#include<algorithm>#

2017-07-22 10:42:42 548

原创 bzoj3810[Coci2015]Stanovi 记忆化搜索

一开始没想到,不过这题模型不是很明显。。估计我也想不出来= = 设f[x][y][a][b][c][d]表示当前分割长度为x,宽为y的矩形,a,b,c,d表示是否与四边接触,核心转移就是把一个矩形分成两半然后继续往下做。[您的好友:(卡常狂魔)已上线] min速度太慢不能用,换成if会好很多。。 然后我发现,把define变成直接写居然会快上200多ms。。woc。。#include<cstd

2017-07-22 09:37:51 357

原创 bzoj2424 [HAOI2010]订货 费用流

由于太久没有打费用流导致我第一眼以为是DP。。。 这就是裸的费用流,先把每个月看作一个点. 然后 S到每个点i,连容量为inf,费用为单价的边 每个点i到T,连容量为需求,费用为0的边。 最后每一个点连向下一个点,费用为m,容量为s,这个很好理解吧。 然后跑一边费用流就好了。 //定义的数组名字意思和实际意思不同搞得我很难受= =#include<cstdio>#include<al

2017-07-20 17:29:58 200

原创 bzoj3357[Usaco2004]等差数列 DP

简单的dp,一开始处理复杂了。 明显设f[i][j]表示做到第i个差为j,然后有f[i][k]=(f[j][k]+1) 注意一下初值,因为是map所以初值在dp的时候才赋。 数组开大了RE了激发。#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<map>#define fo(i

2017-07-20 16:11:29 418

原创 bzoj1057[ZJOI2007]棋盘制作 悬线法DP

题意略。 这题应该是悬线法的一个基础应用,这个方法其实就是DP的一种。现在我们假设有一条线从i,j出发,根据题目01交替的条件,分别向上,左右三个方向进行延伸,那么最后的矩形面积就是左右长度*向上延伸的长度,正方形则是取两者最小值然后平方。#include<cstdio>#include<algorithm>#include<cstring>#define fo(i,a,b) for(int

2017-07-20 15:32:57 281

原创 bzoj3886[Usaco2015 Jan]Moovie Mooving 状压DP

其实是很简单的状压..但是我太菜了没有想到。 一开始的DP方程就列错了,直接列了个求最终答案的。。 设f[i]表示状态为i时能看到的最远时间,转移显然,二分一下起始点就好了= =#include<cstdio>#include<algorithm>#include<cstring>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,

2017-07-20 12:27:27 413

原创 bzoj3446 [Usaco2014 Feb]Cow Decathlon 状压DP

还是比较明显的模型,明显是把k,p小的先做了,然后设f[i]表示状态为i的最大分值。 转移显然。#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--

2017-07-20 10:55:31 449

原创 bzoj3312[Usaco2013 Nov]No Change 状压DP

比较明显的模型,一眼状压。 一开始想的设f[i][j]表示前i个,状态为j,然后发现会T。 后来发现原来i可以去掉,设f[j]表示状态为j时能买的最多账单。 二分加速一下,然后求出最大的f,用ans存一下,然后答案就是sum[m]-ans。 一开始忘记判断-1白白WA了两发。#include<cstdio>#include<algorithm>#include<cstring>#inc

2017-07-20 10:26:02 288

原创 bzoj4094[Usaco2013 Dec]Optimal Milking 线段树

一开始死刚DP,刚了半天感觉不大对劲,好像不大像dp,突然发现原来这不就是一个线段吗= =,维护一下左边右边是否选择就好了。#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int

2017-07-19 22:34:24 300

原创 bzoj3697 采药人的路径 点分治

一道拖了很久的点分治,现在把他搞定了。 来自出题人hta的题解: 本题可以考虑树的点分治。问题就变成求过根满足条件的路径数。 路径上的休息站一定是在起点到根的路径上,或者根到终点的路径上。 如何判断一条从根出发的路径是否包含休息站?只要在dfs中记录下这条路径的和x,同时用个标志数组判断这条路径是否存在前缀和为x的节点。 这样我们枚举根节点的每个子树。用f[i][0…1],g[i][0…1

2017-07-19 20:59:58 250

原创 bzoj4724 [POI2017]Podzielno 数论

题意比较明显就不说了。 这题并不用什么算法,,只是探究性质。 可以证明,一个数能被B-1整除,那么他在b进制下的每一位的和加起来刚好能被B-1整除。 证明: 当这个数的某一位+1时,进位,那么这一位减去B-1,下一位+1 当这个数的某一位-1时,退位,那么这一位加上B-1,下一位-1. 于是当一个数加上B-1时,他在B进制下模B-1意义下是不变的。那么对于这个题目,我要最大,所以取最多的

2017-07-19 16:51:56 268

原创 bzoj3887 [Usaco2015 Jan]Grass Cownoisseur tarjan+拓补排序

题意不说了。 %%%popoqqq 既然没有要求一条边不能被经过两次,那么在强连通分量内的所有点都有贡献,所以先缩点,这个挺显然的。 问题是这个逆边要怎么选,,有一个明显结论 将某条边反向后 缩点之后的图形成了一个包含1号节点所在强连通分量的环 这样才能使答案增加 把这个环从反向的边和1号节点所在的强连通分量断开,一条路是从1到n,另外一条是从n到1. 那么我们缩点以后拓补排序一下,把正

2017-07-19 10:38:06 685

原创 bzoj3450 Tyvj1952 Easy 概率期望

期望比较差来刷水。。 结果发现水过头了。。 这个根本不用任何dp知识吧。。 不过居然没有秒切,看来我还是太菜了。#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i

2017-07-16 22:11:58 340

原创 【NOI2017模拟6.3】子序列 矩阵乘法+DP

准队爷富榄出的题目,被虐的不要不要的,打了个40分还被卡常。。。 题意:给你1个长度为n的字符串,每次给出询问l,r问l,r中有多少个本质不同的子序列。 n,q<=1e5。 一开始差点连题目都没理解清楚,子序列一定不连续,子串才连续= =。。一个并不显然的dp是设f[i][j]表示第i位为j的答案,那么初始f[i][s[i]]=1,然后f[i][j]+=sigma(f[i][1-9]),然后我

2017-07-16 21:05:54 925

原创 bzoj4726 [POI2017]Sabota 二分+暴力

直接二分,判断的话太显然了吧。。 不知道为什么那么少人A。#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace std;

2017-07-16 20:44:59 369

原创 bzoj2407 矩阵 spfa+构造

这题考试的时候没什么想法,打了个dfs水一发,结果连30分都没拿到。。 有一种水法可以A,就是枚举第一条出边,然后去掉这条边跑最短路,考场上有人A了。 如果不是有水法的话这题应该还是有些难度的。我们先跑一遍spfa,然后构造,中心思想是只保留对于答案有贡献的,这样构造才有意义。 接下来贴题解(from hzwer)。1: 该边为(u,1,w) ,即从u点连向原点的边若 u != p[u] 说

2017-07-15 21:10:02 366

原创 bzoj2405 数字 打表找规律

这题考试的时候就切了。刚开始看到,以为是什么矩阵乘法之类的,但是感觉好像没有递推的性质。 想了半天没有什么想法,然后就想着打个表试试看吧。 先打了D的表,发现好像计算和用(n-1)%9+1就可以了。。 直接计算的话好像会T。 然后找了一会儿没什么性质,然后就去找总答案。 感觉总答案的话好像很有规律的样子,但是有感觉不知道有什么规律。 然后记录了一下每个数字在区间内的出现次数,然后逐渐扩大

2017-07-15 21:03:30 528

空空如也

空空如也

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

TA关注的人

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