随笔分类 - OI
bz3112 [Zjoi2013]防守战线
摘要:这个题挺厉害的,一道线性规划和网络流结合的经典模型。那样例来解释吧:Min->X1+5*X2+6*X3+3*X4+4*X5X2+X3≥1X1+X2+X3+X4+X5≥4X3+X4+X5≥2X1,X2,X3,X4,X5≥0我们可以利用对偶原理把它转化成标准形式:Max->Y1+4*Y2+2*Y3Y2≤1Y1+Y2≤5Y1+Y2+Y3≤6Y2+Y3≤3Y2+Y3≤4增加松弛变量,把标准形式变成松弛形式Max->Z=Y1+4*Y2+2*Y3Y2+Y4=1Y1+Y2+Y5=5Y1+Y2+Y3+Y6=6Y2+Y3+Y7=3Y2+Y3+Y8=4到这里,其实我们已经可以利用单纯形来解决了。
阅读全文
bzoj1499 [NOI2005]瑰丽华尔兹
摘要:很容易想出O(NMT)的算法,枚举时间,然后枚举位置,转移就好了,大概是f[t][i][j]=max(f[t-1][i][j],f[t-1][i-dx[t]][j-dy[t]]+1) dx,dy表示某时刻的滑行方向。这样显然过不了,但是看到每一时间段滑行的方向是相同的,也就是只会在一条直线上转移,于是可以用单调队列维护这一条线上的最优值。当某位置是障碍的时候,这个点不能转移或者被转移,那么清空队列;当转移长度大于时间段长度的时候,当前值不合法,需要后移队首指针;当不动比队尾还要优的时候,队尾永远不可能成为最优值,那么前移队尾指针。这样枚举时间段,枚举位置就可以了,O(NMK)。adv1900
阅读全文
bzoj1563 [NOI2009]诗人小G
摘要:决策单调优化的1D1D动规,比较经典的题,链接一下byvoid大神的博客http://www.byvoid.com/blog/noi-2009-poet博客里说的很清楚了。这个题主要是利用了四边形不等式证出了决策的单调性,这样我们可以二分不停地更新决策区间,这样效率nlogn可以ac。由于这个题比较奇葩,要求大于10^18的输出Too hard to arrange,所以过程中需要保存大于long long的数,所以我们用long double 保存中间量,这样最后再转成long long 就行了。poet 1 #include<iostream> 2 #include<cs
阅读全文
bzoj1483 [HNOI2009]梦幻布丁
摘要:水题。网上都说是什么链表的启发式合并,我也不太明白,反正我就写了个链表,然后也没什么启发式合并,就那么暴力合并就行了,速度也不慢。我们记录每个位置的下一个和它一样的颜色的位置next[i],对于每个i如果i+1!=next[i],那么i处会构成一个颜色短,一开始先这么统计出来,往后只可能增加,不可能减少。另外记录每个颜色的起始位置。合并的时候把两个颜色(x,y)都扫一遍,遇到相邻的x,y就链上,然后如果出现了i+1==next[i]就把答案数减1。注意最后保证x的信息全都复制到了y上才行。pudding 1 #include<iostream> 2 #include<cstd
阅读全文
Begin
摘要:那一天,我闭目在经殿的香雾中,蓦然听见,你颂经中的真言;那一月,我摇动所有的经筒,不为超度,只为触摸你的指尖; 那一年,磕长头匍匐在山路,不为觐见,只为贴着你的温暖; 那一世,转山转水转佛塔,不为修来世,只为途中与你相见。 那一月,我轻转过所有经筒,不为超度,只为触摸你的指纹; 那一...
阅读全文
bzoj2806 [Ctsc2012]Cheat
摘要:后缀自动机+dp,后缀自动机是用来求出给定文章最长的在模板中出现的字串的长度,这个很好做吧。把文章在模板上匹配就行了,记录每一位的最大匹配长度就行了。然后我们二分答案,然后按照答案的限制求得最大匹配字符数。dp的方程很容易求得:f[i]=max{f[j]+i-j}。然后,假设二分的答案是limit,某位置的最大匹配长度是v[i],决策区间就是[i-v[i],i-limit],由于i-limit是逐步增加的,那么每一次只需要往队列里添加i-limit这个点,然后判断队首是否在决策区间里,即是否q[head]>=i-v[i]。那么此时单调队列里的元素都在决策区间里。这样就可以用队首元素的到最
阅读全文
bzoj2668 [cqoi2012]交换棋子
摘要:费用流题,构图非常巧妙。考虑每个点的交换限制的约束,一看就知道是点容量,但是这里不是一分为二,而是一分为三。首先我们把问题化简,变成对于原图上所有黑点,找到一个新图中的黑点,进行多次交换后到达。我们看到多次交换实际上是走了一条路径(这里不是最短路)。对于这条路径的起点和终点,仅进行了1次交换,而路径上的其他点都交换了2次。所以我们需要构造一种图来把这个交换次数的差异体现出来,于是:对于每个点一分为三,分为p0,p1,p2,对于每个点,如果它是原图中得黑点,连边<p1,p0,c/2,0>,<p0,p2,(c+1)/2>,<st,p0,1,0>;如果它是新图中得
阅读全文
bzoj2668 [BeiJing wc2012]连连看
摘要:赤果果的费用流,我闲的练单纯形的模板,不过发现跑的还挺快的...哈哈。 N^2预处理出一些需要用到的信息,然后变量是一个y^2-x^2=z^2的等式,每个约束条件是一个数在每个等式中出现的次数和小于等于1,这样就很直观了。为了方便,可以把预处理是出现在等式中得数字离散出来,构造出矩阵就行了。 单纯形最麻烦的就是构造矩阵了,算法的操作实际上就是个类似高斯消元的东西,由于是0-1单纯形,这种写法就挺舒服的了。 对于方案数,直接求出各个等式变量的值就行了,具体方法是看哪个等式的MAT[i][0]=0. Match 1 #include<iostream> 2 #include<cs
阅读全文
bzoj3118 Orz the MST
摘要:这个题有原型,上海2004那个mst,加边减边的代价都是1,做法一样,但是那个题单纯形被卡空间了......囧。 分析一下:对于每条非指定在mst里的边(以下称非树边),它一定存在且仅存在一个出它之外全由树边组成的环里,那么这条非树边一定比环里其它边长,那么我们要么增加这条非树边,要么减少其它树边,方能满足条件。于是就可以对于每条非树边,找到那些和它相关的树边,就可以列出线性规划式了。利用对偶转化成松弛形式,就可以单纯形了。这里额外提一下,对于这种约束的系数为0,1,-1,所求值为整数的线性规划,可以用简化版单纯形法,详见代码: orz the mst 1 #include<iost..
阅读全文
bzoj2879 [Noi2012]美食节
摘要:这个题一眼看出是修车,但数据范围有点卡,我傻傻地以为写个zkw就万事大吉了,结果发现zkw还没有spfa跑的快......这个题的关键是动态加边,就是每次找到已经增广到最新的点的厨师给他加一个新点,这样一共需要增广P次,就可以跑出答案了。View Code #include<iostream>#include<cstdio>#include<algorithm>#include<cmath>#include<cstring>#define maxn 100000#define maxm 100000#define inf 214748
阅读全文
bzoj 1079 着色方案
摘要:我真是弱到什么都不会了.......... 想不出来了: 从c<=5中分析大概15^(5~6)比较靠谱,但我们记每个颜色拿了多少是5^15的,于是转换一下思路,我们记录可以使用1,2,3,4,5次的颜色有多少种,把可以使用的次数相同的颜色看做等价的,于是状态变少了,我们可以记忆化搜索。 f[a][b][c][d][e][last]表示可以使用1,2,3,4,5次的颜色有a,b,c,d,e种,上一次拿的是第last个等价颜色(上次可以拿last次,那么这次只能拿last-1次) 那么很容易推出转移式子,注意对于相邻位置不能是相同的颜色的设定,我们规定这次拿的等价颜色不能喝上次的等价颜...
阅读全文
bzoj 3132 上帝造题七分钟
摘要:bit区间增加区间求和,只不过是二维的......比一维麻烦多了。 这种题还是得自己推啊,强记果断会晕掉。 公式大概是ΣΣdij*(x-i+1)*(y-j+1),其中dij表示在(i,j)点上累计的增量,展开后得到ΣΣdij*(x+1)*(y+1)-dij*i*(y+1)-dij*j*(x+1)+dij*i*j 然后x+1和y+1是在具体询问中才知道的,所以我们维护4个bit:dij , dij*i , dij*j , dij*i*j 。 询问的时候注意上面乘i的下面要乘x+1,上面乘j的下面要乘y+1。 View Code 1 #include<iostream> 2 #inc.
阅读全文
bzoj 1095 ZJOI2007 捉迷藏
摘要:额,这个题巨恶心啦~ 树分治不会写,只能翻论文写括号序列了,cqx把每个点分成了三分"(",“)”,数字,那么两个数字之间未匹配的括号数就是两个点之间的距离,然后我们要求的就是两个黑点之间的距离,于是就可以用线段树维护了吧。 最恶心的就是维护了,要维护6个量,左括号总数,右括号总数,前缀和,前缀差,后缀和,后缀差(只是简称),合并的时候用后4个量可以得到区间的最大距离,然后这6个量之间可以互相更新,不行我已经晕了,如果有兴趣的话去看看cqx的论文吧,贴个代码帮助有耐心的人差错...... 对于黑白点的处理,就吧白点的后4个量设为-inf,黑点的后4个量设为0,就可以了。 h
阅读全文
整体二分初步
摘要:整体二分是个很神的东西,它可以把许多复杂的数据结构题化简。它的精髓在于巧妙地利用了离线的特点,把所有的修改、询问操作整体把握。 先说说第k大数吧,这种问题是整体二分的标志性题目,什么划分树啊,主席树啊,树套树啊见了整体二分都得自叹不如。首先对于一次询问来说我们可以二分答案,然后通过验证比答案大的数有多少个来不断地缩小答案范围直至得到一个准确的答案。而对于多个询问我们同样可以这么做,只不过对每一个询问我们都需要判定一下,以决定它被划分到哪一个答案的区间里。这个判定过程就是通过比较比二分的mid大的数的个数和k。同时我们看到,如果比二分的mid大的数的个数小于k了,我们是要去寻找小的答案,那...
阅读全文
bzoj 3119 book
摘要:题意:给你一个N项数列的首项X,之后的每一项要么比前一项多A,要么少B,N项前缀和为M,构造一个可行的数列。分析:首先,后一项只和前一项有关,那么对于一项来说+A和-B都是对后面每一项都造成影响的,比如第i个位置选择+A,那么后面N-i+1个位置相对都+A。于是我们设一共加了x个A,y个b,容易得到:ax+by=M-N*Xx+y=n*(n-1)/2这样我们可以解得x和y,那么怎么求方案呢?我们看到x和y是由1..n-1这些数组合而成的。并且我们发现,1..n*(n-1)/2中所有的数都可以用1..n-1中得数组合成,我们观察组合的过程(以10为例),1=1,2=2,3=3...11=10+1,
阅读全文
网络流模型小结
摘要:最近网络流题做得算是比较多了,有许多类似的模型,这里做一下总结:1.0 最大权闭合子图 这种模型最经典的是noi2006最大获利,模型就是一些有依赖关系的点,权值有正有负,拿了一个就要拿它的所有后继节点,然后求一个最大的权值。方法是保留原图中的边,容量定位无穷,对于每个正权点,S向它连权值容量的边;对于每个负权点,它想T连权值绝对值容量的边,跑一边最小割,最后答案就是用所有正权减去最大流。详细的讲解请看amber的那篇经典论文《最小割模型在信息学竞赛中的应用》。这里我说一下求方案的问题。由于我们选出来的点是求完各割以后与S点都属于相连的集合,所以从S点跑一边dfs就行了。类似的问题还有PO..
阅读全文
bzoj 2434 阿狸的打字机
摘要:好久没写AC自动机了,学了SAM以后发现对AC自动机的理解也加深了,其实它们的精髓都是用后缀的前缀来处理字串(后缀数组也是)。 那么这个题光会写AC自动机可不行,还要会处理询问。这个题询问第x个串在第y个串中出现的次数,于是我们可以想到把所有串建AC自动机,然后利用fail指针的性质:沿着fail指针上溯,所经过的都是以当前节点为右端点的字串,也就是说fail[i]代表的字串在i中一定出现过。所以我们把fail边反向,出现了一颗fail树,那么如果一个串在P位置上出现了,那么在它的所有儿子中一定也出现了,于是可以用树状数组维护这棵fail树的dfs序来维护答案。 方法是:按照一开始建A...
阅读全文
后缀自动机入门
摘要:前几天被substr虐了,于是怒而学后缀自动机,结果看了一下午没看懂,囧.......昨天总算是看出点端倪了,发现写起来还是挺短的,起码比后缀数组好写多了~!原理什么的CLJ大神的课件里讲的已经很细致了,比网上的一些讲的都要透彻,建议初次学习的话还是去看这个。其实一个后缀自动机里的点代表的不光是它自己,还包括所有以它为右端点的字串(曾经的后缀),那么后缀自动机上就可以处理一些字串以及后缀的问题了。它的时空复杂度都是O(n)的,所以可以非常有效地解决一些字符串问题。这个图可以非常直观地表现后缀自动机的神奇之处:1.0 NSUBSTR 这个题用后缀自动机做真是一目了然啊,写完才60行.......
阅读全文
Spoj 1825 Freetour2
摘要:点分治第二题,分治过程写的比较熟练了,但搞答案的时候还是想了好久,写了好久.......主要解释一下求g的那块吧:首先dep[i]表示rot的第i个儿子的子树里黑点最多的路径的的黑点数。黑点限制是K,我们可以求出rot的每一个儿子i黑点数为j的最大长度g[i,j],然后每次求出一个j1+j2<=K,且g[i1,j1]+g[i2,j2]最大的。如果我们枚举i2,那么只需要求出一个可以和i2配并且最长的i1就行了。这个可以用个什么数据结构维护,也可以“暴力”。由于顺序是对答案没有影响的,那么我们按照dep升序排序,然后按照这个顺序计算,mg[j]表示前i个点的g[j]的最大值,如果维护好mg
阅读全文
Poj 1741 Tree
摘要:据说是传说中的男人八题之一,其实是点分治的练手题......不过第一次写调起来还是比较恶心的。话说QZC的论文我是完全没有看懂,上网找了一份代码看看才有点思路。树分治算法大致要分成几个过程:预处理->分治{分割,计算答案,递归处理子树}就是这样了。但实际写起来却要写各种dfs和bfs,但这种东西点双边双写多了就不会出什么错了,我在find计算答案那块调了好久,后来发现dis的下标应该是队列的标记,而不是某个点。我写的点分治,主过程是solve,递归地solve下去:每次先choose一个重心,然后计算这颗树里所有答案(就是计算出每个点到根的距离然后判断即可),然后减去路径不经过根的答案(
阅读全文
浙公网安备 33010602011771号