2019.4.summary

2019.4.1
BZOJ1061: [Noi2008]志愿者招募
真心有点难QAQ
https://www.byvoid.com/zhs/blog/noi-2008-employee
看void爷的博客看了三遍才懂。这种网络流建模看不出来啊
首先可以列出一些数相加减的式子
然后可以考虑差分,得到一些式子和为0的情况
这不就很像每一个点流量平衡对吧
正的是流进来的,负的是流出去的
常数是关于s,t点流进流出的

BZOJ1066: [SCOI2007]蜥蜴
一看就很网络流对吧,多个点同时可以移动
然后每个平台的高度不就是限制着这个平台能通过的蜥蜴数嘛
这个就是网络流的拆点对吧QAQ


2019.4.2
BZOJ1067: [SCOI2007]降雨量
倍增维护最大值
询问(a,b),分为a,b是否已知来讨论即可

BZOJ1068: [SCOI2007]压缩
因为每次合并的都是连续的,所以想到区间dp,但是如果只是普通的那种定义的区间dp,不知道哪个地方新加了一个M使得缓冲区从哪开始
f[l][r][0/1]表示[l,r]区间,是否出现了一次M,注意我们规定l-1默认有一个M
当s[l…mid]=s[mid+1…r]时f[l][r][0]=min(f[l][mid][0]+1)
否则f[l][r][0]=min{f[l][k][0]+r-k}
对于中间插入了M,枚举在哪插入即可f[l][r][1]=min{min(f[l][k][0],f[l][k][1])+1+min(f[k+1][r][0],f[k+1][r][1])}
注意l倒着枚举

BZOJ1070: [SCOI2007]修车
第一眼贪心QAQ,zz了
这种全局的一种规划,而且一个人还能修多辆车,有多个人,每个人那的顺序还有影响,考虑网络流模型
这个题型之前看书看到过,但是记不清楚了
把每个人拆成n个点,表示这个人修的倒数第几个车,如果是倒数第k个车,那么它的贡献不就是k*tim[],因为后面还有k-1个人在等着对吧
然后源向所有车连边,所有车向人拆出的点连边,人拆出的点向汇连边

BZOJ1071: [SCOI2007]组队
还没做过这种题,单调性问题,n^2指针乱搞
明天填坑
我来填坑了

一开始没想明白的地方就是被删的点会不会还没有加进去过,导致现在忽略它而后面又把它加进去,想了一下,是不存在的
删的条件就是H<=h<=C/A+H, s<S
左边变为Ah<=AH+C,同号相加
Ah+Bs<=AH+BS+C
这不就是加入的条件吗,锅完
这种问题一看就是要按住一维用特殊方法统计另一维


2019.4.3
BZOJ1072: [SCOI2007]排列perm
第一眼数位dp
不对,它就是用给定的这些数,不是<=它的所有数,所以不是数位dp
状压dp,f[S][j]表示当前已经选了原数列中的S这些数了,且组成的新数%d=j的个数
然后枚举往最后面添加那个数就行了,刷一下表
但是这是有问题的,原数列中可能有多个同样的数,往后面加的可能是第一个1,第二个1,第三个1……
这都是一样的,由有相同数的排列可以知道,要除以每个数出现次数的阶乘

BZOJ1073: [SCOI2007]kshort
k短路有时间保障的算法:yen算法,不会可持久化数据结构,先咕这
写了A*,特判了一个点,
A*最重要的就是估价函数h(x),我们定位当前点到终点的最短路长度,取个反图跑spfa就行了
然后用优先队列代替普通队列,当前走的距离f(x)+h(x)越小,优先级越大
剩下的就跟普通bfs差不多了QAQ

BZOJ1075: [SCOI2007]最优驾车drive
感觉这道题最难想的就是状态的表达吧
首先走的路程是一定的,f[x][y][t]表示x方向走了x步,y方向走了y步,用时为t
但是t可能不是整数鸭
把所有v/5,则v=[1,10],此时t’=5*L/v
在把t乘上lcm(1,2,3,……,10)=2520,最后再除掉
然后dp就很常规了对吧,考虑从当前点用什么速度往哪个方向走


2019.4.4
BZOJ1076: [SCOI2008]奖励关
数据范围一眼状压dp+期望dp对吧
晚上回来填坑

填坑.
首先考虑如果f[i][S]表示进行了前i次以后接受的集合为S的期望得分,但这你怎么算期望呢,考虑逆推(听说很多期望dp都要考虑逆推)
f[i][S]表示进行了前i次接受的集合为S接下来的几轮最多还能得分
考虑枚举下一轮出现的,如果已经达到了它的先决条件,就有取或不取两种决策,
否则只能不取
因为这个加上了所有下一轮可能出现的所有情况,因为是期望,取平均,/n

BZOJ1077: [SCOI2008]天平
这道题很没思路哇,暴力枚举?
发现只有三个数1,2,3,可以通过大小的一些传递弄出具体的值
比方说得到了a<b<c,那么a,b,c就唯一对应了1,2,3
所以设mn[i][j]为a[i]-a[j]的最小值,mx[i][j]为a[i]-a[j]最大值
然后可以用floyd传递一下
注意mn[i][j]=max(mn[i][j],mn[i][k]+mn[k][j])
注意是max,因为如果取min的话,可能有一些达不到,mx相反要min

BZOJ1078: [SCOI2008]斜堆
贪心,orz mato的题解
对于这种不断给它添加数的题可以先分析一下它的一些性质,可以从第一个插入或最后一个插入入手

考虑最后一个插入节点的性质,
(1)它一定是从根不断只往左儿子走
(2)它没有右儿子
但是满足这样的点有很多,我们还可以发现对于一个点,如果它没有左儿子,那么它也不会有右儿子(换句话说,只有根节点没有左儿子)
而在插入一个结点之前,其所有的祖先都被交换了左右子树,所以,若新结点的祖先中有满足(1)(2)的,且新结点不是叶结点,
那么在新结点插入之前,这个满足(1)(2)的祖先必然是只有右子树而木有左子树的,这与上面的那个性质矛盾,所以,可以得出:
最后插入的那个结点一定是满足(1)(2)的结点中,深度最小的那个(设为X),除非X的左子结点是叶结点,此时为了满足字典序最小,
应该取X的左子结点为最后插入的(因为我们是倒序考虑的)。找到这个最后插入的结点以后,只需要把它删掉,并把它的所有祖先交换左右子树,就是插入该结点以前的状态了。
这样可以找到字典序最小的插入顺序


2019.4.5
BZOJ1079: [SCOI2008]着色方案
一开始的思路是组合数+容斥乱搞?但是考虑到连续三个会包括连续两个的状态,而又不好统计对吧?
以后做题要多看看数据范围,c[]<=5
先不考虑相邻的限制的话,f[a][b][c][d][e]表示还能涂1个的颜色有a种,能涂2个的颜色有b种……且当前正要涂第n-1a-2b-3c-4d-5e+1个点
如果拿了一个能涂i个的颜色,那能涂i个的颜色就减少了1种,能涂i-1个的颜色就多了一种
所以f[a][b][c][d][e]=a
f[a-1][b][c][d][e]+bf[a+1][b-1][c][d][e]+cf[a][b+1][c-1][d][e]+……
考虑如果相邻,再加一维last表示上一个选的是能涂几个的颜色(1……5)
则此时能涂last-1个的颜色就少了一个选择(很显然对吧)

BZOJ1080: [SCOI2008]劣质编码
一开始觉得就是建出AC机然后乱搞,很明显是xjb乱扯对吧
30,可以搜索,但是怎么搜呢
每个串长度<=50,所以如果表示第i个串的第j位,可以用i<<6|j来编码对吧
然后BFS,枚举下一位是0/1,然后就很naive了对吧QAQ

BZOJ1081: [SCOI2005]超级格雷码
找规律然后搜索QAQ

BZOJ1082: [SCOI2005]栅栏
一眼二分答案+dfs
首先肯定是最小的mid个被满足(显然)
然后考虑剪枝,
首先一般从大的到小的来满足往往更快一些
(1)如果某一块连最小的一块都不能满足,res就加上它,然后如果sum[mid]>sumall-res就减掉(sumall就是所有给你的木板的长度和)
(2)如果第i个和第i-1个木板长度一样,它两相对顺序是不影响的对吧,所以不用从1来枚举用那块木板供给i-1,直接从i枚举就行了,可以避免重复计算(想一想为什么)

BZOJ1083: [SCOI2005]繁忙的都市
mdzz
第一眼题目没读懂,不就是最小生成树模板嘛

BZOJ1084: [SCOI2005]最大子矩阵
首先肯定是dp,就两列嘛,分开讨论
一列的话f[i][j]到第i个选了j个矩形
两列的话w[i][j][k]表示第一列选到了第i个,第二列选到了第j个,组成k个矩形
转移就是枚举当前选还是不选,选的话要选到哪
话说第二种转移我竟没想到,看来dp还是要强化鸭QAQ

BZOJ1085: [SCOI2005]骑士精神
肯定搜索吧,然后它说了最大限度答案为15,超过了就直接不算了
那我们很容易想到IDA*对吧

BZOJ1086: [SCOI2005]王室联邦
膜了siyuan的题解
我们DFS整棵树,处理每个节点时,将其一部分子节点分块,将未被分块的子节点返回到上一层。
枚举u的每个子节点v,递归处理子树后,将每个子节点返回的未被分块的节点添加到集合S中,一旦|S|>=B 就把S作为一个新的块并将u作为省会,然后清空S并继续枚举v。
处理完所有子树后,将u也加入到集合S中,此时在S中的节点为未被分块的节点,将被返回到上一层,显然S的大小最大为B?1个子树节点+u节点本身,即|S|<=B。
由于返回的集合的大小最大为B,对于一个子树会对集合最多增加B?1个节点,那么每个块的大小最大为2B?1,满足条件。
在DFS 结束后,集合S中可能还有节点(最多有B个),那么我们把这B个节点并入最后一个块(以根节点为省会的最后一个块)中,那么这个块的大小最大为3B-1,符合条件。

BZOJ1087: [SCOI2005]互不侵犯King
第一眼不是和八皇后差不多嘛,才发现国王覆盖面积小,要搜索更耗时,接受不了
每个格子只有两种状态,一行只有N<=9个格子,考虑状压dp
很简单想到转移,枚举当前行和上一行,但是时间明显接受不了对吧
那就预处理dfs出一行所有可能出现的情况,和两种情况能不能是相邻两行就行了QAQ

BZOJ1088: [SCOI2005]扫雷Mine
很显然如果前面两个确定了,那第一行就确定了
根据a[1]讨论一下就行了对吧

BZOJ1089: [SCOI2003]严格n元树
设f[i]表示深度小于等于i的个数
f[i]=f[i-1]^n +1
因为根的n个儿子每个子树深度都<=i-1,所以乘法原理一乘
还有 一个深度为0,也就是就一个根的情况
然后答案就是f[d]-f[d-1],d=0特判,高精度+,-,*,^


2019.4.6
BZOJ1090: [SCOI2003]字符串折叠
一眼区间dp,首先是最基本的套路f[l][r]=min(r-l+1,f[l][k]+f[k+1][r])
如果k+1r可以由lk循环得到,f[l][r]=min(f[l][r],f[l][k]+2+calc((r-k)/(i-l+1)+1))
calc表示整数位数,很显然对吧QAQ

BZOJ1092: [SCOI2003]蜘蛛难题
按时间一步一步模拟。
每一次,首先将所有目前没有水但是下一步可以被灌到水的管子标记为有水,然后求出有水的管子里水面高度的最小值。
如果a号管有水且最小值为b,那么说明此时蜘蛛碰到了水。
如果有管子溢出且最小值就是它,那么说明此时无论如何水面都不会

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值