自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

KGV093的博客

Revelations and heartaches, make you realize.

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

原创 bzoj 1596(树形dp)

传送门题解:定义dp[0/1/2][i]表示在子树所有节点均被覆盖的前提下,当前节点被子树中的点覆盖/自己覆盖/不被覆盖,需要的通讯塔个数(子树中)定义dp[2][pos]目的是将其转移给dp[0][father]。dp[0][p]=∑dp[2][son]dp[1][p]=∑min{dp[0][son],dp[1][son],dp[2][son]}dp[2][p]=min{

2017-10-18 08:44:42 240

原创 bzoj 4726(树形dp)

传送门从20:40想到21:40,我有时候还真是智障啊TAT。。。题解:结论1.最坏情况下初始叛徒一定是一个叶节点 结论2.最终的所有叛徒一定是某个节点为根的子树中的所有节点 定义f[p]为p的子树不叛变的最小x。f[p]=max{f[p],min{f[v],siz[v]/(siz[p]-1)}}。两个东西取min的原因:两个同时大于x才会使v的

2017-10-17 20:44:48 257

原创 hdu 1561(树形dp)(背包dp)

传送门题解:设dp[pos][num]表示以pos为根的子树中选num个的最大收益。按树形背包的方式转移:dp[p][i]=max{dp[p][i-k]+dp[son][k]}最终答案就是dp[0][m+1]。#include#include#include#includeusing namespace std;const int MAXN=204;int n,

2017-10-17 19:59:14 270

原创 poj 3252(数位dp)

传送门题解:数位dp基础题。注意前导0的特殊处理。P.S.空间优化:dfs函数中0和1的两个计数参数,可以二合一为cnt,表示0和1的差值,计算时整体右移32位即可(防止下标为负)#include#include#include#includeusing namespace std;int s,t,dp[33][33][33],b[33];//当前数位,当前0的出现次数,

2017-10-17 17:12:08 269

原创 bzoj 3223(非旋转treap/splay)

传送门~~~给不会写splay的Oier的福利~~~题解:维护一个合并式treap,打个类似于线段树lazy_tag的rev标记,每次需要翻转再进行左右儿子交换,记得pushdown就好。最后中序遍历一次treap即可得到所有操作后的序列。P.S.splay版的就不贴代码了,网上到处都有,下面是的合并式treap,与splay相比,速度略快(不靠读入优化),代码略短(^

2017-10-16 21:55:49 317 1

原创 bzoj 3594(树状数组优化dp)

传送门题解:设dp[i][j]表示前i个玉米用j次操作的LIS长度。dp[i][j]=max{dp[x][y]}+1(x维护一个关于(j,max{a[i]}+j)的树状数组,每次倒序枚举j防止dp[i]内部自己更新自己,如果正序枚举可能发现这种情况:dp[i][k]更新到后来dp[i][j](k由dp转移式知dp[i][...]只能被dp[比i小的数][...]更新到。

2017-10-16 19:56:12 293

原创 bzoj 1087(状压dp)

传送门题解:先预处理st[i]和num[i]两个数组,表示第i个自身合法的状态是啥以及它有多少个1,定义d[i][j][k]表示前i行,当前行为i状态并且还剩k个国王的方案数,从上往下递推即可。P.S.希望下次不要再因为什么longlong之类的错失1A的良机qwq。。。#include#include#include#includeusing namespace std;

2017-10-16 19:18:40 218

原创 bzoj 3224(非旋转treap)

传送门 附上两篇讲解: http://www.cnblogs.com/nietzsche-oier/p/6748292.html http://blog.csdn.net/zmh964685331/article/details/50536410 P.S.非旋转treap比普通treap慢,比splay快,可以实现splay能实现的而其余平衡树无法实现的操作比如区间翻转。#include<c

2017-10-15 17:42:36 256

原创 hdu 3401(单调队列优化dp)

传送门 题解: 构造状态dp[i][j]表示第i 天拥有 j只股票的时候,赚了多少钱 从前一天不买不卖 dp[i][j]=max(dp[i-1][j],dp[i][j]) 从前i-W-1天买进一些股 dp[i][j]=max(dp[i-W-1][k]-(j-k)*AP[i],dp[i][j]) 从i-W-1天卖掉一些股 dp[i][j]=max(dp[i-W-1][k]+(k-j)*BP[

2017-10-15 17:36:35 364

原创 NOIP集训Week 5总结

感觉本周过的特别快,上周这个时候干的事仿佛就在昨天。 本周完成的内容有:差分约束系统、各种二分图、无向图tarjan的几个应用(tarjan/点双/边双)(这里多嘴一句:本菜鸡有史以来第一次想到了神犇学长丁神没考虑到的算法细节就是关于tarjan的low函数)、欧拉路径相关问题、并查集的几个应用(带权并查集、按秩合并、增量最小生成树、次小生成树)、最小树形图、单调队列(优化dp)、主席树高级应用,

2017-10-15 12:38:08 227

原创 tvyj 1313(单调队列优化dp)

传送门 题解: 设dp[i]表示以1~i范围内(保证i处放一个烽火台)的最小代价。 dp[i]=min{dp[j]+w[i]}(i-j+1<=m) 用一个单调递增的队列维护dp数组,每次用队首更新答案,将元素插入队尾。#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespac

2017-10-15 12:20:14 380

原创 tyvj 1305(单调队列)

传送门 题意: 输入一个长度为n的整数序列,从中找出一段不超过M的连续子序列,使得整个序列的和最大。题解: 维护一个关于前缀和的单调递增的队列,每次用队首更新答案,将元素插入队尾。 P.S.单调队列都做不来的弱鸡。。。#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespac

2017-10-15 11:05:14 374

原创 hdu 3530(单调队列)

传送门 题解: 用一个单调不升的队列维护最大值,一个单调不减的队列维护最小值。如果不满足条件,后移答案区间左端点,取两个队列头指针的元素较小的一个(位置尽量靠前使区间尽量长)。#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int MAXN=1

2017-10-13 21:53:47 460

原创 bzoj 4443(二分+二分图最大匹配)

传送门题解:二分答案x,对于权值不大于x的点行列连边,跑二分图最大匹配,如果匹配数小于n-k+1(第k大即第n-k+1小),则left增大,否则right减小。最后分到的left+1一定是答案。#include#include#include#includeusing namespace std;const int MAXN=254,INF=0x3f3f3f3f;int

2017-10-13 20:32:42 245

原创 Luogu 2679(dp)(NOIP 2015)

传送门NOIP 2015 D2T2题解:定义dp[i][j][k]为a串前i个字符,b串前j个字符,分成k段的方案数(a[i]必须选)。定义sum[i][j][k]为a串前i个字符,b串前j个字符,分成k段的方案数(a[i]可选可不选)。直接来要爆空间,所以第一维采用滚动数组优化。那么两个数组互相转移:dp[cur][j][k]=sum[cur^1][j-1][k-1]

2017-10-13 19:48:05 180

原创 bzoj 1202(差分约束)/(带权并查集)

传送门 如果看到题不知道要转前缀和就可以退竞晒了。。。 题解1: (差分约束我居然1A了啦啦啦~~~,虽然这是道大水题) s[b]-s[a-1]=c,一看就是差分约束的套路: s[a-1]≤s[b]-c,连边(b,a-1,-c) s[b]≤s[a-1]+c,连边(a-1,b,c) 将所有点push进队列用SPFA找负权环即可,找到为false,没有为true。#include<cstd

2017-10-13 14:39:55 412

转载 非旋转/可持久化treap(转自Sengxian's Blog)

非旋转 Treap 及可持久化 TreapPublished on 2017-10-12基本知识:普通堆,二叉搜索树,可持久化基本思想。介绍性质Treap = Tree + HeapTreap 是一颗同时拥有二叉搜索树和堆性质的一颗二叉树Treap 有两个关键字,在这里定义为:key\text{key}key:满足二叉搜索树性质,即中序遍历按

2017-10-13 12:04:02 445

原创 bzoj 1103(DFS序+树状数组)

传送门 题意: 两种操作: 1.修改某条边的边权(0/1) 2.询问某个点到1路径上的边权和题解: 在DFS序上差分+树状数组。#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int MAXN=250004;int n,m;int h

2017-10-13 11:48:11 280

原创 hdu 1829(带权并查集)

传送门 题解:并查集维护0/1权值。#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int MAXN=2004;int n,m;int fa[MAXN];bool val[MAXN];inline int read() { int

2017-10-13 11:13:43 241

原创 hdu 3047(带权并查集)

传送门昨天才考过一道差不多的,用离线+BFS预处理+裸并查集水掉了(^_^)题意:有n个人坐在zjnu体育馆里面,然后给出m个他们之间的距离, 代表B的座位比A多X.。然后求出这m个关系之间有多少个与之前的关系有冲突。题解:用带权并查集维护点到根距离,在merge操作时:P.S.注意每组数据初始化时dis也要清空!!!#include#include#i

2017-10-13 09:08:47 259

原创 bzoj 4668(并查集按秩合并)

传送门题意:两种操作,强制在线。1.将u,v连边2.询问u,v最早什么时候已经连通题解:每次连边就更新时间戳赋成每个点的点权,查询链上最大值,所以不能压缩路径(压了路径无法解决分叉的情况),为了保证复杂度,采用按秩合并(复杂度mlogm?)。#include#include#include#includeusing namespace std;co

2017-10-13 08:36:03 345

转载 网络流建模汇总(转自Edelweiss)

最大流《POJ 1149    PIGS》 【题目大意】有 M 个猪圈,每个猪圈里初始时有若干头猪。一开始所有猪圈都是关闭的。依 次来了 N  个顾客,每个顾客分别会打开指定的几个猪圈,从中买若干头猪。每个顾客分别都有他能够买的数量的上限。每个顾客走后,他打开的那些猪圈中的 猪,都可以被任意地调换到其它开着的猪圈里,然后所有猪圈重新关上。问总共 最多能卖出多少头猪。(1

2017-10-12 21:53:20 1637

原创 二分图最大匹配小结

重要定理: 二分图最小点覆盖=最大匹配 二分图最小边覆盖=|V|-最大匹配 二分图最大独立集=|V|-最大匹配匈牙利算法(时间复杂度O(V*E))模板: DFS:(hdu 1150 最小点覆盖)#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const

2017-10-12 21:49:45 308

原创 hdu 1150(最小点覆盖)

传送门 二分图最大匹配=最小点覆盖 题解:二分图左边点集为机器A的模式,右边为机器B的模式。对于每个任务,左右连边,最后跑一遍二分图最大匹配(最小点覆盖)即可。#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int MAXN=104;int

2017-10-12 21:30:50 275

原创 bzoj 4950(二分图最大匹配)

传送门 题意:求在不改变整个区域的三视图的前提下最多能拿走多少的箱子。 题解:(以下均在俯视的情况下) 对于每个有物品的格子,如果它有k个物品,最多能拿走k-1个。 显然只要留下每行每列最大值即可使三视图不变,于是将减多的补回来。然而这么操作有忽略了一个问题,题目说这个家伙可以重新安排物品位置,所以:如果i行,j列最大值相同,那么将只要交点处摆成最大值,其余的取得只剩1。就是说把多的补回来这

2017-10-12 21:06:29 345

原创 lightoj 1123(增量最小生成树)

传送门每次跑最小生成树,如果生成环就把当前边(无效边)去掉。#include#include#include#includeusing namespace std;const int MAXN=204,MAXM=6004;int n,m;int fa[MAXN];struct EDGE { int u,v,w; bool operator <(const EDGE

2017-10-12 19:34:29 349

原创 hihocoder 1181(浅谈佛罗莱算法在求欧拉路径可行解中的应用)

传送门小Ho:这种简单的谜题就交给我吧!小Hi:真的没问题么?小Ho:啊啊啊啊啊!搞不定啊!!!骨牌数量一多就乱了。小Hi:哎,我就知道你会遇到问题。小Ho:小Hi快来帮帮我!小Hi:好了,好了。让我们一起来解决这个问题。小Hi:原来是这样。。。小Ho你仔细观察这个例子:因为相连的两个数字总是相同的,不妨我们只写一次,那么这个例子可以写成:3-2-4

2017-10-12 18:50:09 412

原创 bzoj 1123(tarjan)

传送门 题意:在一个无向连通图中,求出对于每一个点,割掉该点有多少对有序点对不连通。(删掉的点也算)题解: 由tarjan求割点时顺便维护dfs树上的siz和ans。P.S.注意枚举来自不同儿子的子树点对时的写法,这样操作算的是无序点对(后面的不会再与之前的匹配),所以最后答案要乘以2。#include<cstdio>#include<cstring>#include<iostream>#

2017-10-11 21:04:27 276

原创 poj 1637 (浅谈最大流在解决混合图欧拉回路中的应用)

传送门 题解: 本人的欧拉路径专题总结☜戳这里。在#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<queue>using namespace std;const int MAXN=202,MAXM=1002,INF=0x3f3f3f3f;int n,m;int head[

2017-10-11 20:00:13 398

原创 欧拉路径(欧拉图、半欧拉图)小结

NOIP填坑计划继续。。。先说说基本概念: 欧拉路径:一条路径在图G中恰好经过每条边一次。再看看相关概念: 欧拉通路:通过图中所有边的简单路(其实就是每条边经过一次)。 欧拉回路:闭合的欧拉路。 欧拉图:包含欧拉回路的图。 半欧拉图:包含欧拉通路但是不含欧拉回路的图。接着理解orz(半)欧拉图成立的充要条件: 欧拉图: 无向图G是一个欧拉图当且仅当G连通且所有顶点的度数为偶。 有向图

2017-10-11 17:16:37 1947

原创 Luogu 1186(SPFA)

传送门 题解: 因为只有最短路上的边被断才对新最短路有影响,所以: 1.先跑一遍最短路 2.枚举最短路上每一条边,将其断掉,再跑最短路 3.输出所有最短路的最大值P.S.之前WA了好几次是因为把原来的最短路径树当成原来的最短路了。。。#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#incl

2017-10-11 16:51:04 177

原创 Luogu 1074(tarjan+dp)

传送门 NOIP 2009 T3 题解:可以用两边SPFA过,也可以用tarjan+dp过。 如果使用第二种方法,那么记录一下每个强连通分量内的最大最小值,然后设f[i]为从1所在强连通分量到i所在强连通分量,用类似SPFA的BFS更新f值,最后输出f[n]。P.S.两边SPFA的做法:从1用正向边搜一遍最小值(最短路),从n用反向边搜一遍最大值(最长路),然后用两遍都经过的点的最大最小值之差

2017-10-11 15:11:22 213

原创 poj 3352(tarjan)

传送门 题意:加最少的边使原图(保证所有点连通)成为一个边-双连通图。 题解:用tarjan求双连通分量缩点(形成一棵无根树)后计算度数为1的节点(叶节点)的个数为cnt,那么答案为(cnt+1)/2。下面是证明:首先把两个最近公共祖先最远的两个叶节点之间连接一条边,这样可以把这两个点到祖先的路径上所有点收缩到一起,因为一个形成的环一定是双连通的。然后再找两个最近公共祖先最远的两个叶节点,这样一

2017-10-11 09:14:08 269

原创 UVa 10099(kruskal/Floyd)

传送门 题解: 求每条路径上最小权值的最大值,数据范围是出给Floyd,但是可以用kruskal构造最大生成树实现。 P.S.本人做UVA说是要巩固基础,另一大原因就是想刷点访问量╮(╯▽╰)╭,一道大水题做了接近半个小时,真是点背。。。#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#incl

2017-10-10 20:58:16 315

原创 hdu 4336(状压+期望dp)

传送门 题意:有n(1<=n<=20)张卡片,每包中含有卡片的概率为p1,p2……pn。每包最多有一张卡片,可能没有卡片。求需要买多少包才能凑齐N张卡片,求次数的期望。 真是把2016NOIP两道压轴题的算法都用到了!第一次见到状压和期望一起考的。此题比较水,直接枚举卡片倒推即可。#include<cstdio>#include<cstring>#include<iostream>#inc

2017-10-10 19:42:10 271

原创 poj 3311(浅谈状态压缩动态规划在解决TSP问题中的应用)

传送门 题意: 给出0~n个点两两的路径长度,求出从0号点出发遍历1~n每个点一次再回到0号点的最小花费。注意同一对点来回路径可能不等长! 题解: 经典的TSP问题(以下内容摘自百度百科):TSP问题是一个组合优化问题。该问题可以被证明具有NPC计算复杂性。因此,任何能使该问题的求解得以简化的方法,都将受到高度的评价和关注。定义dp[st][pos]表示当前0/1状态为st位置在pos的最小

2017-10-10 19:10:05 613

原创 OpenJudge 7384(分成互质组)

应hfu要求,近几日整理搜索专题的内容,无意中翻出了一年前死活A不掉的一道不可做题(当时觉得)。看着自己的代码风格变化天翻地覆,无奈感叹时间飞逝。。。算了少矫情管他的先A了再说(ง •̀_•́)ง先附上一年前WA(8/10)的代码#include<stdio.h>int n,divide[15][10],sum[15]={0},t,a[15],num1,ans=0;int prime(int a

2017-10-10 17:17:31 611

原创 poj 1821(单调队列优化dp)

传送门 题解: 定义dp[i][j]为前i个人涂j块木板的最大收益。 显然dp转移方程如下: dp[i][j]=max{dp[i][j],dp[i-1][k]+(j-k)*p[i].w} 其中k∈[max(0,p[i].s-p[i].len),min(p[i].s-1,j)] 用单调队列维护dp[i-1][k]-k*p[i].w即可。单调队列真是又一个大盲点啊。。。蒟蒻赶紧学。。。#in

2017-10-10 16:34:30 343 1

原创 poj 3692(浅谈二分图最大匹配求最大独立集在解决最大团问题中的应用)

传送门 这个,最近班上同学写博文标题越来越不清真。听说这么写可以涨不少访问量于是我就来试一次。。。题解: 先定义两个概念。 最大独立集:顶点集V中取K个顶点,其两两间无连接。 最大团:顶点集V中取 K个顶点,其两两之间均有边连接 再说两个定理(说实话,个人觉得这两个都很显然,所以证明略)。 最大独立集=顶点数-最大匹配 最大团=补图(将没连的连上,把连了的断开)的最大独立集下面该怎么做

2017-10-10 16:27:34 380 1

原创 UVAlive 3126(最小路径覆盖)

传送门 题解: 构造一个DAG,每个客人是一个节点,如果同一个出租车在接完客人u以后还来得及接客人v,那么连有向边(u,v)。关于求DAG最小路径覆盖: 以下内容转自XWL的博客 我们可以发现: 在DAG中,每条路径除了结尾的点,其他每个点都有一个唯一的后继结点。 举个例子:上图中 2->3->4 这条路径上,2的后继3、3的后继是4、4没有后继。 那么求路径条数的问题可以转换为求结

2017-10-09 22:04:27 346

空空如也

空空如也

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

TA关注的人

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