BZOJ
文章平均质量分 76
njlcazl
这个作者很懒,什么都没留下…
展开
-
【BZOJ1003】【DP】【最短路】物流运输
一开始把这道题想得有点复杂。因为可能有很多种情况,比如k值很大每次都用次短路结果最优,或者k值很小每次都用最短路结果最优,如果还要变化的话就更复杂了。但其实后来一想,我们只需要暴力枚举出每一段时间,用cost(s,t)表示在[s,t]这段时间中的最小费用,然后DP:f[i] = min(cost(1,i),f[j] + cost(j+1,i) + k)这样问题就顺利解决了。代码:#原创 2012-12-16 08:08:45 · 2172 阅读 · 0 评论 -
【HNOI2008】【斜率优化DP】玩具装箱
很直观的一维DP状态:f[i]表示将前i个玩具打包的最小费用。朴素方程:f[i] = min{f[j] + (w[j+1][i] - L) ^ 2}(w[j+1][i] =∑Ck + i - (j + 1),j < i,k∈[j+1,i])但是直接朴素会TLE,所以我们考虑将方程变形,挖掘方程的性质。令sum[i]=∑Ck k∈[1,i]-> f[i原创 2013-04-03 10:01:16 · 586 阅读 · 0 评论 -
【BZOJ1004】【Burnside定理】【DP】【扩展欧几里徳】cards
看到这道题,如果之前做过相关的一些题的话应该会很快知道这是一道重复计数类问题。解决这类问题的话不得不提到的就是:Burnside定理和Pólya计数法,由于我数学比较弱,所以这里也不介绍了。具体可见<!--@page {margin:2cm}p {margin-bottom:0.21cm; direction:ltr; color:#000000; text-ali原创 2012-12-18 21:34:42 · 1769 阅读 · 0 评论 -
【ZJOI2008】【link-cut tree】树的统计
这道题写了比较久。。。主要是手残比较多关键的一点是由于题目直接给出了树的每条边,所以建树要用dfs来建,我最开始使用access(x)然后pre[x] = y的方法要WA,不过我感觉这样做是对的。。。当然这种感觉上对的方法不但是错的,而且效率肯定不如dfs其他的就是动态树的基本操作了,没什么好说的。代码:#include#include#includeusing name原创 2013-04-15 20:19:06 · 521 阅读 · 0 评论 -
【SDOI2008】【link-cut tree】洞穴勘测
题目大意:维护一个森林中两点的连通性情况,有插入一条边和删除一条边两种操作。直接使用link-cut-tree维护森林的连通性即可。注意在找出一条路径后需要维护splay上的翻转标记。还有就是splay旋转的时候不能写把两种情况合在一句写,这样有可能引起死循环!这个Bug我找了很久。以后一定要注意,见注释的那句话。代码:#include#include#include原创 2013-04-14 10:37:50 · 558 阅读 · 0 评论 -
【ZJOI2008】【DP】生日聚会
比较简单的DP,关键是设计好状态。使用f[i][j][p1][p2]表示前i个小孩中有j个男孩,且男孩比女孩多p1个,女孩比男孩多p2个的方案数根据当前状态累加之后的状态转移方程:f[i+1][j+1][p1+1][p2-1] =∑f[i][j][p1][p2],f[i+1][j][p1-1][p2+1] =∑f[i][j][p1][p2]由于根据当前状态累加之后的状态原创 2013-05-14 11:27:31 · 1025 阅读 · 0 评论 -
【BZOJ1001】【平面图最小割】狼抓兔子
在BZOJ上做的第一道题。看到题目自然想到最小割,但数据范围表示不能通过求最大流的方法来求最小割,所以可以转化为在建立平面图的对偶图后使用最短路求解。具体可见冬令营论文《两极相通--浅析最大最小定理在信息学竞赛中的应用》,讲的比较详细。s-t平面图的特点:1、题目中给出的是一个平面图 2、图中的一个点为源点s,另外一个点为汇点原创 2012-12-12 20:21:51 · 1418 阅读 · 0 评论 -
【BZOJ1002】【高精度】【找规律】轮状病毒
一开始想到一个错误的组合数的解法。写了各种高精浪费两个小时才发现是错的。最后没办法只有爆搜出来找规律。n=11n=25n=316n=445n=5121n=6320n=7841n=82205n=95776n=1015125原创 2012-12-14 21:34:26 · 1694 阅读 · 0 评论 -
【ZJOI2007】【悬线法】棋盘制作
最近学习悬线法,所以就找了这道题练练手。因为棋盘是01交错的,所以我们可以先处理一下棋盘,从而转化为求最大子矩形问题。第一问可以用DP也可以用悬线法,我DP写得比较熟所以用了DP。第二问直接用悬线法求出处理过的棋盘的最大子矩形即可代码:#include#includeusing namespace std;const int maxn = 2000 + 10;int原创 2013-02-15 01:05:35 · 770 阅读 · 0 评论 -
【BZOJ2653】【二分法】【主席树】middle
题目大意:给出长度为n的一个序列s,回答q个询问:s的左端点在[a,b],右端点在[c,d]的子序列中,最大的中位数,强制在线。将问题转化为判定性问题,先二分出一个数x,然后将区间内大于等于x的数标记为1,小于x的数标记为-1求区间和sum,如果sum>= 0说明中位数可以比当前数大,这样可以通过迭代求出最大的中位数。但是题目中限定了左端点和右端点,不难想到可以通过求最大子序列的方原创 2013-05-05 09:50:31 · 878 阅读 · 0 评论 -
【SDOI2009】【树状数组】HH的项链
题目大意:询问一个序列中区间[a,b]中不同的数有几个,无修改操作。比较容易想到的是使用线段树套平衡树来解决,但是这道题需要有合并的操作,时间复杂度很高,不能接受。我们可以考虑,当一个区间有若干个同色点时,我们只能算一个,所以我们需要找出一个具有代表性的点,于是我们可以想到找区间中某种颜色第一次出现的位置来代表。并且我们可以知道这样的点的共同特点为上一个该颜色的点在查询区间的左侧,这样问题原创 2013-04-04 10:39:13 · 1121 阅读 · 0 评论 -
【JSOI2007】【后缀数组】字符加密
后缀数组的水题。将字符串再复制一份到末尾,剖环为链。然后求出sa,那么后缀在前pos个的后缀的末尾字符就是答案。代码:#include#includeusing namespace std;const int maxn = 200000 + 10;int wa[maxn],wb[maxn],ws[maxn],wv[maxn],sa[maxn],r[maxn],rank[ma原创 2013-04-14 10:56:11 · 512 阅读 · 0 评论 -
【BZOJ1251】【splay】序列终结者
第一次用splay做关于数列的题,比一般的splay写法更加麻烦,但是它是基于元素的,而线段树是基于整段区间的,所以在数据范围大而且分散的情况下线段树几乎不能做(Ps:可以考虑离散化),这个时候就可以使用splay来维护一个数列。这道题不能用线段树做的原因不是因为数据范围,而是这道题涉及到了翻转操作,线段树不支持这种操作,所以用splay来维护。对于每个节点维护val,Max和add表示当原创 2013-02-26 16:07:46 · 1445 阅读 · 1 评论 -
【SCOI2010】【线段树】序列操作
做这道题之前就知道这题比较恶心,但是为了保持心态也没当作很难的题来做。维护的标记比较多一些:1、从左边开始的最多0的个数和1的个数2、从右边开始的最多0的个数和1的个数3、区间最大的0的个数和1的个数4、区间0的个数和1的个数5、是否反转6、覆盖标记有思路之后硬着头皮写,结果写下来一堆bug,改着比较烦,而且浪费时间。比赛也没有那么多时间改bug,所以平原创 2013-02-15 00:57:03 · 709 阅读 · 0 评论 -
【HNOI2004】【SBT】宠物收养所
很裸的一道平衡树的题。唯一要思考的一点就是需要维护一个当前树的种类,如果当前进来的与树的种类相同的话,就直接插入,否则就找一个最接近的的值并把那个值删除,并记录答案就行了。代码:#include#include#define L ch[p][0]#define R ch[p][1]#define LL ch[ch[p][0]][0]#define RR ch[ch[p][1]原创 2013-03-17 16:00:13 · 553 阅读 · 0 评论 -
【ZJOI2010】【最大流】【最小费用最大流】网络扩容
第一问就是一个最大流的裸题。第二问的话思维难度也不大,一开始加边的时候费用为0,然后如果原图有边,就加入一条对应的流量无限,费用为扩容费用的边,要注意的是如果有重边需要选择费用最小的一条,再加一个源点s,连边s-t,流量为k,费用为0的边,然后做一次最小费用最大流就可以了。代码:#include#include#includeusing namespace std;cons原创 2013-03-18 22:07:29 · 530 阅读 · 0 评论 -
【NOI2004】【splay】【SBT】郁闷的出纳员
这道题用很多数据结构都可以做,这里用splay实现。因为增加工资和减少工资都是对所有员工进行操作,所以维护一个delta就行,因为操作只对之前的工资档案有效,所以在新加入数据时需先减去delta。还有就是如果刚来就低于下界的人是不计入离开的总人数的。splay维护子树的size以及每个数据的个数cnt,其他就是基本的操作。代码:#include#includeusing原创 2013-02-19 21:49:00 · 559 阅读 · 0 评论 -
【ZJOI2007】【斜率优化DP】仓库建设
看到题目,容易写出朴素的规划方程:f[i]表示在第i个点建设一个仓库,前i个货物点运送的最小总费用则f[i]= min(f[j] + w[j][i]) + c[i]其中w[i][j] = p[j+1][1] *(x[i] - x[j+1]) + p[j+2] *(x[i] - x[j+2]) + .... p[i] * (x[i] - x[i])但是n的范围非常大,所以需要优化方程原创 2013-04-04 21:27:54 · 986 阅读 · 0 评论 -
【HAOI2010】【强连通分量】【树形动态规划】软件安装
这道题是一道水题。。。由于软件的依赖关系可能是一个环,所以先将原图缩点。将缩点后的树转化为二叉树后f[i][j]表示以i为跟的子树分配j的空间得到的最大价值,l[i],r[i]表示i的左儿子和右儿子则f[i][j] = max(f[r[i]][j],f[l[i]][k] + f[r[i]][j - k - w[i]] + v[i])使用记忆化实现。代码:#include原创 2013-04-10 09:02:45 · 1142 阅读 · 0 评论 -
【ZJOI2008】【树形动态规划】骑士
分析图的特点可以发现,该图是由n个点n条边构成,并且可以由多个连通块构成,每个连通块最多只有一个环。所以图上点的情况只有两种:在环上或不在环上对于不在环上的点可以直接使用树形动态规划求解。对于在环上的点,只需要分两种情况:选了第一个点,或者选了最后一个点,取一个最大值就行。动态规划状态:f[i][0],f[i][1]分别表示选了第i个点和不选第i个点的最大武力值。转移方原创 2013-04-14 16:39:31 · 728 阅读 · 0 评论 -
【GDOI2010】【最小割】圈地计划
纠结了比较久的题。对应前两个矩阵的条件联系最小割的意义很容易明白构图先黑白染色,对于黑色格子来说s -> p边权为map1[i][j],p -> t边权为map2[i][j]对于白色格子来说s -> p边权为map2[i][j],p -> t边权唯map1[i][j]然后对于相邻的格子连边,边权为map3[i][j] + map3[i'][j'](这点想了很久。。。也是这道题比较关原创 2013-05-20 22:20:31 · 884 阅读 · 0 评论