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 左边变为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 所以设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]=af[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,那么说明此时蜘蛛碰到了水。
如果有管子溢出且最小值就是它,那么说明此时无论如何水面都不会再上涨,即无解。
然后往所有高度等于最小值的管子里灌上一高度的水即可。
2019.4.7
好像欠的锅有点多,那我就先修一下锅吧QAQ
ZROI B. Str
首先这是一个置换对吧,因为它的长度<=10000,那我们就先暴力求一下它的循环节,然后取模一下,再用循环节-取模后的,表示还要做几次就会回到原型,在暴力做回原型
ZROI C. Not TSP
YY出了行走的过程,写了一个爆搜,拿了40pts QAQ
肯定就是选了一个第一个点以后只能往左走,且接下来只能往左走,可以跳一段也可以一步一步走过一段,
然后直到走到1,这时候回头走的路径是唯一的了,之前跳过的路径只能走,之前走过的只能跳
然后我的爆搜想法就是不断枚举下一步跳到哪
实际上这可以看成是两条路径对吧,考虑dp
逆向思维,看成从1出发的两条路径可以吧
f[i][j]表示两条一条走到了i,一条走到了j
对于max(i,j)+1有两种走法,第一,从某一个规规矩矩走一步,第二,从某一个跳一下
这种考虑问题的方式还没想过,见识了QAQ
一开始我觉得这样会不会出现中间某一段直接跳过两段都没有走,但这是不可能的
因为每次都是走到max(i,j)+1,说明有一段已经把前面都走过了
ZROI D. Game
吐槽一下,老师最近为啥开始弄博弈了呢QAQ
当时找找规律瞎搞A了,zyb说这个有可能是能hack的QAQ
考虑竖线和横线一定是交错出现(就是说你这一步放得竖线,那下一个人就必须放横线,显然)
而且放得两条线还有联系,这很像二分图对吧
把所有横线看成x点,所有纵轴看成y点,对于每一个出现的点,把对应的横纵坐标连边
接下来的游戏过程就是把一个点移动到它相邻的点上
这个蓝书上面讲过,当存在完美匹配时候后者必胜,否则前者必胜(由增广路想一想)
ZROI C. 【19寒假普转提】哈啤题
比赛的时候瞎写了一个二分+暴力得了90???错的一个点还是Wa了???
首先这种题应该考虑到的应该是从每一个点往两边扩展的最大限度L[i],R[i](是长度),第一步我就没有想到QAQ
这个显然是单调的扫一遍就得到了对吧QAQ
枚举每一个为那个中心,然后最左边的点显然就是i-min(L[i],R[i+1])+1,把i压到一个vector a[i-min(L[i],R[i+1])+1]
注意这里是极限,意思是从i-min(L[i],R[i+1])+1一直到i-1,i都是可以作为中点的
意思是……又是单调的?QAQ
那就用一个multiset维护一下呗,枚举每一个点作为左端点,然后维护那个multiset很easy吧QAQ
ZROI D. 【19寒假普转提】简单题
见识太少了,也是自己的责任,之前的时候看博弈的时候有人建议一块把博弈整个都看掉,当时太功利,
斐波那契博弈
QAQ
https://blog.csdn.net/dgq8211/article/details/7602807
BZOJ1093: [ZJOI2007]最大半连通子图
首先一个强连通分量内的肯定贡献都一样对吧,所以先缩点
然后这是一个DAG,不就是求最长路dp吗,边拓扑排序边dp
首先缩完点以后建新图,每个点的点权为这个强连通分量大小,注意肯定有重边,要排个序然后再建
最长链dp就不说了吧
2019.4.8
ZROI B. 【19寒假普转提】纸张题
昨天的T2竟然不会做QAQ,一直觉得很数学,没想到就是dp,还是太弱了
我们肯定是对于每一个难度注意确定
有三种选择, 对于能力i个贡献
1.固定死的a[i]
2.能力可为i-1,或i的
3.能力可为i,或i+1的
因为前面都已经确定过了,不考虑了,只有第三种对下一级能力有影响,所以分开dp就好了
f[i][0]:能力i的选1,2两种放
f[i][1]:能力i的选3放
显然f[i][0]=f[i-1][0]*a[i]+f[i-1][1]*a[i]+f[i-1][0]b[i-1]+f[i-1][1](b[i-1]-1)
f[i][1]=f[i-1][0]*b[i]+f[i-1][1]*b[i]
BZOJ1095: [ZJOI2007]Hide 捉迷藏
两种写法,第一种是左右括号匹配法,第二种是动态点分数
我连点分治都不会呢,这周一定要学一下,对没错就这周,明中午?(咕咕)
发现类似dfs序,进入某点时加一个左括号,离开某点时加一个右括号,树上两个点之间的距离一定是这两个点之间不能匹配的括号个数
然后可以推出一些东西,这就可以用线段树来维护对吧
强势安利 岛娘的blog http://www.shuizilong.com/house/archives/bzoj-1095-zjoi2007hide-捉迷藏/
2019.4.9
BZOJ1096: [ZJOI2007]仓库建设
dp,很显然斜率优化,但是还不够熟练,自己推还存在问题呢
BZOJ1097: [POI2007]旅游景点atr
数据范围+套路的话,状压dp
首先预处理出1~k+1点到所有点的最短路,然后根据套路状压dp,不难吧QAQ
BZOJ1098: [POI2007]办公楼biu
如果两个点之间没有边,那么它们就必须在一栋楼里面,这要求的不就是补图的联通块个数吗QAQ
当然这道题先取补图再dfs联通块应该时间应该也可以接受,但是还有一种bfs+链表实现的方法
首先任取一点,把所有不能与他联系的点加入队列,重复这个步骤,这就是一栋楼里的人数
两个链表。一个维护还剩下的点,一个维护当前这个块内的点
2019.4.10
BZOJ1099: [POI2007]树Drz
想了很久呢,首先肯定就是推出交换两个的影响
然后分类讨论,去绝对值,如果交换x和i,发现
x和min(v[i-1],v[i+1]),max(v[i-1],v[i+1])的关系分不同情况对答案有影响,i同理也有三种
乘法原理有九种情况
这就用线段树统计嘛
按照排序按住一维,数据结构搞另外一维的方法统计
很麻烦
https://www.cnblogs.com/clrs97/p/4611323.html
贴一下Claris的博客,还请教了它本人,自己花了半天才搞懂……嗯,以后也可以请教猫猫QωQ
luogu P2257 YY的GCD
终于弄懂了简单的莫比乌斯反演QAQ
膜了一篇blog https://www.cnblogs.com/peng-ym/p/8647856.html
本题讲解http://www.cnblogs.com/peng-ym/p/8652288.html
BZOJ1101: [POI2007]Zap
和上一题差不多
设f(k)=∑i=1~a ∑j=1~b [gcd(i,j)=k]
F(n)=∑n|k f(k)=(a/n)(b/n)
F(n)就表示gcd是n及其倍数 的个数
BZOJ1102: [POI2007]山峰和山谷Grz
就是暴力bfs吧……同时维护联通块一周的最大最小值,最后与联通块作比较
BZOJ1103: [POI2007]大都市meg
没想到用树状数组树上差分这种骚操作
首先转dfs序,每个点记录一个dfn1,一个dfn2,(进出的时间戳)
然后把边权放到深度大的那个点上(也就是放在右端点上,想一想为啥)
然后把x->y边修路,说明到达y及y的子树都会少一条土路,用下差分add(dfn[y][1],-1),add(dfn[y][2]+1,1)
BZOJ1104: [POI2007]洪水pow
并查集
肯定是从小的开始考虑对吧
然后搞两个队列,一个存城市一个存所有的,都排好序了
考虑每一个城市的时候,把高度小于等于这个城市的所有都来一遍并查集,以高度大的做根
2019.4.11
BZOJ1105: [POI2007]石头花园SKA
首先肯定能够想到所有点都是在y=x这条直线的同侧
然后肯定能想到枚举两种情况一种是在下侧,一种是在上侧
但是还有两种周长也不变,虽然有可能覆盖不了全部
图片见下链
https://www.cnblogs.com/Wolfycz/p/8876673.html
BZOJ1192: [HNOI2006]鬼谷子的钱袋
一开始没想到二进制拆分……
觉得二进制拆过以后剩下的不能保证和前面都不一样啊,但是我们可以进行微调使得它不一样
二进制思维,设M可以分解为20+21+22+…+2p+k
若k不为2的某个次方,则直接把这k个金币放入一个钱袋中,
若k为2的某个次方,则把M分解为20+21+22+……+(2p-1)+(k+1)即可(想想为啥的来)。
这样我们便可以证明用(int)(log2(m))+1个钱袋就可以将所有数表示出来。
BZOJ1193: [HNOI2006]马步距离
首先数据范围太大了,肯定不能直接BFS
从(x0,y0)到(x1,y1)实际上相当于从(abs(x0-x1),abs(y0-y1))到(0,0),(相对距离很好想对吧)
都说了不能直接BFS那我们就大规模的贪心呗,当abs(x)+abs(y)是小规模时候在暴力BFS
一开始不理解(x-4>=2*y)之类的是要干啥,就是说先尽量使两个方向上的距离是2:1,然后两步两步条对吧,2:1
BZOJ1208: [HNOI2004]宠物收养所
可以用set来做,但是为了再复习一下splay,还是花了一些时间QAQ
一棵平衡树,当它为空时,下一个来什么就维护什么,在人选宠和宠选人直接不断切换
BZOJ4034: [HAOI2015]树上操作
裸的树链剖分,复习一下
2019.4.12
BZOJ2298: [HAOI2011]problem a
转化挺神的……真的自己没想到,所以要多刷题QAQ
有题目可知
把条件进行转化,可以得到ai个人分数比我高,bi个人分数比我低 实际上就是 我是第ai+1名,算上我一共有n-ai-bi个人和我分数相同。
这里设li=ai+1,ri=n-bi。意义是将分数从大到小排序之后,与第i个人分数相同(包括第i个人)的区间是[li,ri]。
然后我们其实就是想最大说讲真话的人数
我们先排除掉一些
1.li>ri
2.[li,ri]出现次数超过了ri-li+1次,超过的都一定是假话
然后把每种线段的出现次数变成它的权值
接下来就是不交的线段最大权值和
BZOJ2299: [HAOI2011]向量
总感觉yyb的证明有问题的QAQ
首先实际上相当于只有四种操作(a,b),(b,a),(a,-b),(b,-a),只是系数可正可负,设分别出现p,q,f,g次
(p+f)*a+(q+g)*b=x , (p-f)*b+(q-g)*a=y
首先肯定要求gcd(a,b)|x和y
但是没有结束,还有一些奇偶性讨论之类的,不难吧QAQ
一些细节贴一篇blog http://www.cnblogs.com/five20/p/8427795.html
BZOJ1588: [HNOI2002]营业额统计
就是找后继和前驱中最接近的那个跟当前值做做绝对值差,然后把当前值加进去,splay
BZOJ1191: [HNOI2006]超级英雄Hero
一眼二分图对吧
把每一个事件看成左端点,锦囊是右端点,每个左端点向两个右端点连边
BZOJ2006: [NOI2010]超级钢琴
堆和RMQ,动态加入,就是说取到了[l,r],假设它的最大值是si
那么[l.i-1],[i+1,r]也可能对答案有贡献对吧QAQ
BZOJ2818: Gcd
关于欧拉函数线性筛一开始有一个地方不明白,网上一帮sb博主都懒得证,好不容易找到一个海星的
https://blog.csdn.net/bzjr_Log_x/article/details/80144521
本题第一眼就是莫比乌斯反演,当然可做了,但是没有多次询问,可以更简单一些对吧QAQ
关于本题就是求
sigma(i)sigma(j)(gcd(i,j)==prime)
枚举prime,把i,j同除以prime,然后发现j枚举的范围只要到i,然后*2-1就行了,转换为欧拉函数
BZOJ2301: [HAOI2011]Problem b
和POI ZAP差不多,只不过有了上下界,那我们肯定要容斥一下
(a,b)(c,d)组合就是(1,b)(1,d)-(1,a-1)(1,d)-(1,b)(1,c-1)+(1,a-1)(1,c-1)
实际上就转化为了ZAP吧……
BZOJ1189: [HNOI2007]紧急疏散evacuate
先由S向每个有人的点连一条容量为1的边,然后二分时间t,对于每个每个门拆成t个点,每个点向T和下一个时间的点分别连容量为1和inf的边,
表示这个门可以在每个时间里出来一个人,多余的人等到下一个时间
这种全局的移动,每个人都同时移动,大多是网络流
BZOJ1257: [CQOI2007]余数之和
一眼要整数分块对吧QAQ
n>k时显然,那只考虑n<=k
k%i=k-[k/i]*i
显然[k/i]相等的会连成一段,直接整数分块跳一下,然后求和也很easy吧
因为k/i会有sqrt(k)级别种,所有复杂度也就是sqrt(k)
BZOJ1607: [Usaco2008 Dec]Patting Heads 轻拍牛头
水题,每个val[i]都对k*val[i]有1个贡献,然后……
BZOJ2431: [HAOI2009]逆序对数列
就是觉得很dp,但是想不到具体的,我们可以按照1,2,3,……,n的顺序放,f[i][j]表示放1~i,产生了j个逆序对的方案数
当放i时,所有的都比他小,所以如果它放第x个数后面就会产生i-1-x个逆序对,由于它最多会产生i-1个逆序对
所以f[i][j]=Σf[i-1][k](j-i+1<=k<=i),可以上前缀和优化对吧QAQ
2019.4.13
BZOJ2956: 模积和
很明显整数分块对吧
如果不考虑i!=j的话
ΣiΣj (n mod i)(m mod j)=(Σi(n mod i)) *(Σj(m mod j)),这不就可以整数分块吗
然后减去相同的也很naive吧
BZOJ4236: JOIOJI
感觉有点像前缀和,事实的确如此,f[i][0/1/2]表示前i位J/O/I的个数
如果区间[j,i]满足要求
f[i][0]-f[j-1][0]=f[i][1]-f[j-1][1]=f[i][2]-f[j-1][2]
相邻两个把i移到一遍j移到一边,然后二元组丢到map里维护
BZOJ4216: Pig
分块求和
BZOJ2111: [ZJOI2010]Perm 排列计数
这道题真的没啥感觉QAQ
发现可以把它看成一个树形结构对吧,那么i/2就是父节点,所以就是求小根堆的数目
这个可以从底到顶递推
f[i]=C(i-1,s[i<<1])*f[i<<1]f[i<<1|1]%MOD
组合数那一块要用一下Lucas定理C(n,m)%p=C(n/p,m/p)%pC(n%p,m%p)%p
BZOJ1968: [Ahoi2005]COMMON 约数研究
一开始以为要线筛,当然也可以,但也不要那么麻烦
枚举约数(1~n)
i的贡献为n/i
即求Σn/i,可以整数分块对吧
BZOJ3436: 小K的农场
差分约束系统
a-b<=c --> a<=b+c这不就是最短路最后的情况嘛
然后判负环就好了
2019.4.15
ZROI A. 【正睿NOIP普转提半年训练day 16】有趣的数
必须一步一步乘防止long long 溢出
ZROI B. 【正睿NOIP普转提半年训练day 16】木棒
如果是状压dp的话有一点点慢,据李高源说用记忆化搜索写快的飞起
考虑排完序以后,取集合里最小的边,它要么选要么不选
不选的话就是直接从集合把它抹掉以后的方案数
否则的话给它枚举另外两条边
ZROI C. 【正睿NOIP普转提半年训练day 16】装饰
有点遗憾,显然贪心对吧
但是有一点当时想错了,就是sum(c[v])有可能>c[u](v是u的儿子)
ZROI D. 【正睿NOIP普转提半年训练day 16】翻转硬币
这个题比赛的时候就是想不出来QAQ
就是很显然a[1]=a[m+1]=a[2m+1]=a[km+1]
a[2]=a[m+2]=a[2m+2]=a[km+2]
……
我们如果把每m个排成一行,就是相当于要求一列里的数相等就行了
因为n,m<=300
1> m>sqrt(n),此时行数不超过18,对于操作二,以每行为结尾最多只会选一次对吧,爆搜
2> m
注意,如果翻转了第i行,那么前i-1行也会被翻转,所以当没有对前i-1行操作时,它们目前状态和第i行是一样的
CF D. Serval and Rooted Tree
假设答案是x,那么显然比x小的可以看做没有用,当做0吧,然后比x大的当做1
dp[x]表示x这棵子树最下面至少要放多少个1,才能使得x这个点为1,显然最后答案去k-dp[1]+1最优,(k是叶子的个数)
BZOJ3085: 反质数加强版SAPGAP
其实也就是爆搜,但是剪枝太过牛批,对每一个数的指数做限制
2019.4.16
BZOJ3287: Mato的刷屏计划
裸的dp大家都知道,很简单,可以用斜率优化一下,但是高精度咋斜率优化呢
找规律呗QAQ
BZOJ1303: [CQOI2009]中位数图
把大于d的看成1,小于的看成-1,等于的看成0,所求的就是长度为奇数且区间和为0的个数
然后用两个数组维护之前奇数位/偶数位cnt=某数的个数,因为不能存小于0的数,所以+n,然后统计很easy对吧
BZOJ1225: [HNOI2001] 求正整数
听说rqy把搜索给hack了?那就dp
f[i][j]表示考虑前j个素数,约数个数是d[i]的最小正整数
因为太大了,高精度也会TLE
那就考虑对数
log(xy)=log(x)+log(y)
log(x^k)=k*log(x)
最后在找到每一步用的数,然后把他乘起来
BZOJ1207: [HNOI2004]打鼹鼠
相当于最长链差不多的东西吧,有点像lis,嗯
可以稍微乱搞一点优化
BZOJ1201: [HNOI2005]数三角形
只会暴力QAQ,竟然过了
预处理出每一条横向小边向左上右上,左下右下扩展的最远距离
然后枚举底边,来判断
枚举底边的时候有一步不行就退掉(显然单调性吧),然后1000,理论上界n^3就过了
BZOJ2429: [HAOI2006]聪明的猴子
首先肯定要让它联通,然后让最大边尽量小,这不就是kruscal的过程吗QAQ
2019.4.17
BZOJ5495: [2019省队联测]异或粽子
会做法,但是不会可持久化咋办呢,那就不写可持久化呗
如果直接用堆维护的话每个贡献会出现两次,除以二就行了
这题就跟之前 NOI超级钢琴 感觉好像啊?
BZOJ1854: [Scoi2010]游戏
跟之前正睿的一道题好像鸭,并查集维护
在每个武器的两个能力值之间连边,如果一个n个点的联通分量无环,那么它能做n-1次,显然选值最大的那个点不选
如果有环,那么能做n次,
这就启示了我们并查集从小的向大的合并对吧,把一个连通分量最大的作为根,每次合并记录这个联通分量根能不能被使用
最后的时候扫一遍就好啦
2019.4.18
BZOJ3098: Hash Killer II
生日攻击,了解了
http://www.ruanyifeng.com/blog/2018/09/hash-collision-and-birthday-attack.html
这篇讲的比较清楚吧QAQ
BZOJ2208: [Jsoi2010]连通数
floyd+bitset T了
爆搜A了QAQ
BZOJ2226: [Spoj 5971] LCMSum
就是欧拉函数的套路推式子对吧QAQ
https://blog.csdn.net/u010336344/article/details/67629552
就是小于n且和n互质的数的和是n*phi(n)/2
BZOJ2656: [Zjoi2012]数列(sequence)
最后肯定是xa[1]+ya[2]=y
设uA(i)+vA(i+1)=xA(i/2)+yA(i/2+1)
然后分i为奇数和偶数讨论
i为偶数时,x=u+v,y=v,否则i为奇数时,x=u,y=u+v
BZOJ1412: [ZJOI2009]狼和羊的故事
很显然最小割对吧QAQ
详细不说了反正很显然
2019.4.19
BZOJ2330: [SCOI2011]糖果
显然差分约束吧
但是这玩意见图的时候倒着加,因为链式前向星就是倒着的,会被spfa卡掉QAQ
BZOJ1966: [Ahoi2005]VIRUS 病毒检测
在trie树上爆搜,要用bitset记忆化一下
BZOJ4264: 小C找朋友
两个满足要求的点联通情况
1.两个点不相连的话,联通情况相同
2.联通的话,除了自己以外联通情况相同
BZOJ2435: [Noi2011]道路修建
显然就是一个树上的一些计算对吧,dfs会爆栈,用bfs就好了
BZOJ2424: [HAOI2010]订货
很显然是网络流对吧,我竟然没有一眼看出来,沙茶了QAQ
s->xi INF di
xi->t Ui 0
xi->xi+1 S M
好像还有一个老鸽写了dp,我来去看看QAQ
看了一下也挺显然的,发现一般做需要优化的dp题首先肯定是把跟当前有关的量(或者说在某一过程中保持不变的量)提出来,然后里面的那个可以动态维护
BZOJ2456: mode
1MB,我傻眼了……
神解法,把每个数和它不一样的一个数消除一下,因为众数有大于n/2个,所以最后肯定会剩下来
BZOJ1878: [SDOI2009]HH的项链
树状数组
这题首先在线是没法做的,所以我们可以考虑离线算法
首先记录下每种颜色的下一种出现所在的位置
将所有询问按照左端点进行排序
将所有颜色的第一个点x a[x]++
然后从左往右扫
扫到一个点x将a[next[x]]++
碰到一个询问l,r输出sum[r]-sum[l-1]
其中sum是a数组的前缀和
没有想到没有想到,只会敲一个莫队QAQ
2019.4.20
BZOJ1263: [SCOI2006]整数划分
还是没有自己想到QAQ
首先肯定不可能把一单独分出来的对吧,这就相当于没有贡献了对吧
然后考虑a,b>1
有ab>=a+b
证明不难对吧即ab-a-b+1-1>=0
(a-1)(b-1)-1>=0
因为a,b都是整数,所以a,b>=2,得证
所以只会出现2,3两个数对吧
因为任意一个数都可以拆成若干他两的和
由上面的结论emmm
然后23=32
33>22*2
所以尽量多的取3
最后如果剩2就取2
如果剩1就把一个三拆开,加上这个1变成两个2
BZOJ1452: [JSOI2009]Count
显然二维树状数组
其实这种树套树可以理解为
一个树状数组,它的每一个节点也是一个树状数组
BZOJ2705: [SDOI2012]Longge的问题
欧拉函数,很套路的对吧,都快做烂的了
BZOJ2743: [HEOI2012]采花
和HH的项链差不多,但是他统计的是出现次数>=2的,所以,每次把next[] -1,next[next[]] +1
想一想理解一下,这样就能保证最后每个询问都能查询到的是每个颜色最后一次出现的
然后洛谷的数据加强的什么xjb玩意啊,就知道卡,恶心人
BZOJ2241: [SDOI2011]打地鼠
搜索+剪枝,过程很显然对吧QAQ
BZOJ2822: [AHOI2012]树屋阶梯
https://www.luogu.org/blog/Sooke/solution-p2532
emmmm,真的没看出这是卡特兰数呢,看来要看看《具体数学》了QAQ
膜了sooke的博客以后才明白QAQ
因为最后是整数,所以可以把卡特兰数通项公式上下约一下分QAQ
upd.https://blog.csdn.net/crzbulabula/article/details/53809620
感觉这篇比sooke的更直观一些QAQ
一开始沙茶了,认为会不会又比较小的在中间,但是考虑题目要求n级阶梯n个木块,所以说每一个木块都必须是一个台阶(想一想为啥QAQ)
BZOJ1597: [Usaco2008 Mar]土地购买
只想到状压,捂脸QAQ
https://www.cnblogs.com/shenben/p/6255667.html
去膜了一下某大佬的blog,讲的很清楚
把每一个长方形抽象成平面直角坐标系上的点
然后发现是右下角在(0,0)的矩形覆盖
发现点(a,b)如果存在(x,y)x>=a,y>=b,则(a,b)没用了
最后剩下的是x严格递增,y严格递减的点集
显然dp对吧,可以证明出决策单调性
然后上斜率优化
真TM的神题鸭,珂怕的是第一步都想不对QAQ
BZOJ1911: [Apio2010]特别行动队
相比上一道题,这道题比较裸了,一眼斜率优化dp,对吧QAQ
发现如果斜率式子是<,需要先把队头满足<的踢掉,把队尾slop(q[r-1],q[r])>slop(q[r],i)的r也踢掉
的话相反
2019.4.21
BZOJ1967: [Ahoi2005]CROSS 穿越磁场
感觉有点个像对偶图,嗯,差不太多吧……
就是把边给离散化一下,然后spfa,在边之间连边QAQ
BZOJ4247: 挂饰
显然dp题,先按钩子数排个序
f[i][j]:考虑前i个挂饰,有j个钩子的情况
BZOJ3670: [Noi2014]动物园
kmp,定义cnt[i]表示前缀i的前缀和后缀相同的个数,显然可以在kmp预处理的时候递推出来
然后显然对于每个前缀i,设j为第一个2*j<=i且前缀j和前缀i的后缀j个相同的点,则它的答案为cnt[j],想一想很显然对吧
然后这个j在全局也可以用和kmp一样的方法求出,因为要么它为前一个j+1,要么比前一个j小
BZOJ1925: [Sdoi2010]地精部落
好题……真的难鸭QAQ
只能想到了是dp,然后就没有思路了
考虑假设第1位是山峰,因为如果把每一位变成n+1-a[i]就反过来了,所以最后乘以2就行了
f[i][j]表示用1~i的整数,且第一位为j,是山峰的方案数
https://www.luogu.org/blog/user55639/solution-p2467
这个方法真的TM的难想鸭……不过dp嘛只要复杂度对,没有做不到只有想不到QAQ
还有一种方法比较简单,很好想QAQ
https://zhaotiensn.blog.luogu.org/solution-p2467
这很符合套路:这种让你把1到n填数,一般都不是一位一位的考虑填啥,而是考虑按1~n看往哪一位填
BZOJ2662: [BeiJing wc2012]冻结
一眼分层图最短路,就是多加了一维罢了,记录使用了多少次膜法了QAQ
BZOJ2729: [HNOI2012]排队
排列组合
分情况讨论:
老师之间有男生。
那么就是n个男生有n+1个间隔来插老师。
然后一共有n+2个人了。
那么又有n+3个间隔来插女生。
排列组合即可。
老师之间绑一个女生。
那么这个小团体可以看作一个男生因为他两边随便放什么人都行。
这个团体有2*m种可能。
然后一共n+1个男生。
还剩m-1个女生。
此时剩下n+2个间隔。
2019.4.22
ZROI B. 【正睿NOIP普转提半年训练day 17】玩蛇
真的不难,现在代码能力好差鸭QAQ
对于第i行,就是统计(i-1)*i/2+1~(i+1)*i/2
我们每个单词每个单词统计
先预处理出当前单词前i个出现次数
然后把每个询问区间分成若干个整段和一头一尾(如果有的话)
BZOJ C. 【正睿NOIP普转提半年训练day 17】嗷呜
首先考虑正常的lcs的过程,然后发现,如果要使最后lcs=n-1
则f[i][i]只能为i或i-1对吧
而且只能不可能从f[i][i-2]转移过来对吧
所以我们只需要记录f[i][i],f[i-1][i],f[i+1][i],它们各都只有2种情况,共八种情况
f[i][a][b][c]表示解决了前i个,且f[i][i],f[i-1][i],f[i+1][i]的值为a+i-2,b+i-1,c+i-1的个数有多少个
2019.4.23
BZOJ2005: [Noi2010]能量采集
显然每一个点i,j的贡献为(gcd(i,j)-1)*2+1=gcd(i,j)2-1
考虑gcd(i,j)==a的个数f[a],不太好求,似乎可以用容斥
有因数a的个数很简单(n/a)(m/a)
再减去最大公因数为2a,3a,4a,……的个数f[2a],f[3a]……
BZOJ2306: [Ctsc2011]幸福路径
首先这道题没有负数,所以肯定最后多走一点路肯定没有坏处,而且有可能还会无限走下去
但是发现体力衰变的还挺快的,走到一定就会达到精度,对最后的没影响
所以就玄学一点倍增Floyd吧
f[i][j][t]表示从i走了2^t步以后到j
f[i][j][t]=max(f[i][j][t],f[i][k][t-1]+f[k][j][t-1]*p(2(t-1)) )
BZOJ2242: [SDOI2011]计算器
快速幂+BSGS模板题
BZOJ3437: 小P的牧场
很显然第n个肯定要建站,所以dp[i]表示前i个强制在i必须建站的最小代价
dp[i]=min{dp[j]+i*(s[i]-s[j])-(c[i]-c[j])}+a[i]
s是b的前缀和,c是i*b[i]的前缀和
BZOJ1297: [SCOI2009]迷路
没有想到矩阵乘法还有这种骚操作QAQ
如果所有边权都是0/1
用T1[a][b]表示a到b路径权值为1的路径条数
Tn[a][b]表示路径权值为n的路径条数
类似Floyd,(只不过Floyd是取max,这里是sum),Tn[a][b]=Σk Tn-1[a][k]*T1[k][b]
这不就是矩阵乘法嘛?QAQ
可以发现Tn=T1 ^n(把上面式子递归一下显然吧QAQ)
现在边权是[1,9],所以拆一下点就可以了吧QAQ
BZOJ3156: 防御准备
显然斜率优化对吧,一般式子里面出现了转移项和当前项相乘的可以考虑斜率优化
2019.4.24
BZOJ2282: [Sdoi2011]消防
这道题有一点难度……
我想了好久才想明白为什么这条路径一定在直径上
处理出直径及其能到达的非直径的最远距离,然后在直径上用单调队列维护一下
BZOJ3668: [Noi2014]起床困难综合症
这题乍一看没思路,但是一看题解发现应该很容易想到才对,以后看到这种题必须要一眼秒才行呢QAQ
从最高位枚举是0还是1,如果填0最后能变成1,肯定填0,如果填1最后变成0,肯定不论如何也填0,否则看看是否超过m
注意这里我们只看当前位能否变成1
BZOJ3190: [JLOI2013]赛车
把一辆车的运动看成y=v*t+x
显然就是求最多有多少辆车使得每辆在某一时刻y最大
这就是BZOJ第一面的水平可见直线鸭QAQ
半平面交,先按斜率排序,然后用单调栈维护
BZOJ4143 [AMPPZ2014]The Lawyer
把每天的用邻接表串起来,然后找一个结束的尽可能早,一个开始的尽可能的晚的
BZOJ3174: [Tjoi2013]拯救小矮人
我们定义一个小矮人的Ai+Bi为它的逃跑能力。
我们发现,如果有两个小矮人x,y,逃跑能力x
所以就是类似背包的东西
PS.明天我来YY一下具体的证明
2019.4.25
BZOJ3172: [Tjoi2013]单词
显然AC机对吧,把每个节点都要num[]++,表示前缀,建好并处理好AC机以后从队列的逆序,把fail的num都加上当前的num
BZOJ2463: [中山市选2009]谁能赢呢?
一开始竟然觉得有点像二分图博弈,真TM沙茶了
如果n是偶数,则肯定能被若干个1*2的多米诺骨牌覆盖,而先手就是将点从骨牌的一段移到另一端,所以必胜
如果n是奇数,则去掉一个以后一定可以被多米诺骨牌覆盖,而先手走了第一步以后去掉(1,1)剩下的一定可以被覆盖,此时后手每次是将点从骨牌一端移到另一端
BZOJ1177: [Apio2009]Oil
感觉有一点不太容易想,想到了也不难
就是如果要把这三个正方形隔开,有6种划线方法(图见网上题解)
然后我们只要预处理处(i,j)的左上,右上,左下,右下的最大k*k正方形,
等一下我们枚举中间的那个正方形矩形
BZOJ2423: [HAOI2010]最长公共子序列
第一问sb题对吧,第二问g[i][j]表示是达到f[i][j]的方案数
有一点要注意的是当s1[i]!=s2[j]时,且f[i-1][j-1]==f[i][j],那么说明f[i-1][j-1]也会计入f[i-1][j],f[i][j-1]的方案,要减掉一次
BZOJ3751: [NOIP2014]解方程
首先我们要知道的是高次方程没有求根公式,所以带进去O(nm)的复杂度是难免的对吧
我们至于代入检查如果用高精那就砸蛋了,我们考虑hash取模的方法,带三四个质数取模
这样仍会TLE
考虑如果当前模数为p,f(a)是等于f(a+kp)的对吧
所以f(a)=f(a%p),所以我们只需要处理到p-1就行了对吧,这就可以过了
BZOJ1432: [ZJOI2009]Function
orz一发某dalao题解QAQ
https://blog.csdn.net/flaze_/article/details/52886497
2019.4.26
BZOJ1433: [ZJOI2009]假期的宿舍
显然二分图匹配对吧,不多说了
BZOJ4281: [ONTAK2015]Zwiazek Harcerstwa Bajtockiego
显然树上倍增对吧QAQ
BZOJ4278: [ONTAK2015]Tasowanie
显然肯定是每一位都要贪心的取,咋贪心呢,就是取后缀排名尽量小的,但这是两个串,排名标准不一样鸭
那就连成一个串,这是很多后缀数组题的套路,在连接处和最后各插入一个大数,(显然对吧)
BZOJ4277: [ONTAK2015]Ciecie
很好的题鸭,可惜是权限题(捂脸,穷屌路过)
https://blog.csdn.net/weixin_33889245/article/details/86319371
这篇题解讲的很赞啦
这一类题的思路就是预处理出值为符合条件的个数,然后直接加
BZOJ4245: [ONTAK2015]OR-XOR BZOJ1213: [HNOI2004]高精度开根 BZOJ2763: [JLOI2011]飞行路线 BZOJ4146 [AMPPZ2014]Divisors 2019.4.27 BZOJ4195: [Noi2015]程序自动分析 BZOJ2734: [HNOI2012]集合选数 BZOJ4010: [HNOI2015]菜肴制作 BZOJ4001: [TJOI2015]概率论 BZOJ3246: [Ioi2013]Dreaming 那么我们只要预处理处d[i],建好图后用两次dfs来求直径即可 BZOJ1806: [Ioi2007]Miners 矿工配餐 BZOJ3732: Network BZOJ3209: 花神的数论题 2019.4.28 ZROI C. Bag ZROI B. Circle ZROI D. Forest BZOJ2173: 整数的lqp拆分 BZOJ1567: [JSOI2008]Blue Mary的战役地图 BZOJ3997: [TJOI2015]组合数学 BZOJ1800: [Ahoi2009]fly 飞行棋 2019.4.29 BZOJ3109: [cqoi2013]新数独 2019.4.30 BZOJ4198: [Noi2015]荷马史诗 BZOJ4291: [PA2015]Kieszonkowe BZOJ4152: [AMPPZ2014]The Captain BZOJ2257: [Jsoi2009]瓶子和燃料 BZOJ1211: [HNOI2004]树的计数 BZOJ3108: [cqoi2013]图的逆变换
考虑贪心
首先我们知道(a xor b)or b=a or b,这个根据a,b相同位上是0是1讨论一下就出来了
所以最后就是求sum1 or sum2 or …… or summ-1 or sumn
sum是前缀异或和数组
最后的一个一定是sumn,确定的
我们就讨论sumn所有不是1的位,如果能选的里面有>=m-1个这一位为0,就说明这一位可以变成0,然后把能选的里所有这一位不是0的标记为不可选
如果有
只想到二分,注意高精度多压压位,然后二分的时候初始r设为原长/2+1,想一想很显然,然后就A了
显然分层图最短路对吧,多加一维就好啦
没有想到暴力也行???
复杂度显然nlogn对吧,艹
BZOJ4145:[AMPPZ2014]The Prices
显然状压dp对吧,但是因为怕路费不好确定加不加,我们定义f[i][j]表示一定会到i商店,但是买不买不确定(可能这人脑残,花了钱到那个地方然后不买东西),状态为j
但是最后不一定会到i商店对吧,所以最后昨晚以后f[i][j]=min(f[i-1][j])
因为只要等于或不等两个关系,所以我们想到了并查集,因为i,j贼大,所以fa要用map或者先离散化
然后相等的并成一块,不相等的记下来,最后检查是否在一块即可
upd.咕咕上卡map,艹
真的是一点思路都没有呢,膜了黄学长的blog感觉好神哦QAQ
http://hzwer.com/5149.html
首先把它变成一个矩阵,第一行第一个是1,然后右边依次2,下边依次3,最后求的就是选不相邻的数的方案数对吧,
但是这样有一些5,7,……之类的没有出现对吧,那就看成不同矩阵,矩阵之间是互相独立的,方案数满足乘法原理
有一些位会>n,我们把它用n+1填上,预处理的时候强制不选它就行了
一眼能看出这是拓扑排序有关的,但是如果正着做按字典序就是错的
因为字典序是一种贪心,它保证的每一步取得的字典序尽量小,不是1尽量考前
很套路的想到反图,然后按字典序从大到小跑toposort,最后倒着输出就好啦
为啥呢,因为这样能先取大的就先取大的,保证了编号小的尽可能的往前面了
好难,一点想法都没有(捂脸)
https://www.luogu.org/blog/rqy/solution-p3978
先把rqy的题解放上来QAQ
唯一一个还能懂的题解(虽然花了好久,还问了rqy)QAQ
一开始不知道为啥n-1个点的树有n个位置可以再放一个叶子
问了rqy,他说是因为共有2(n-1)个位置,除了根节点以外的点占了n-2个位置,所以还有n个位置,嗯嗯
然后发现一个n个节点k个叶子的树去掉一个叶子以后会变成n-1个点树,这有k种情况
而每一棵n-1个点的树只会由n个n+1个点的树去掉一个叶子变成,(上面说了)
而一共有f[n-1]种不同的n-1个节点的树,这个显然是卡特兰数
所以g[n]=sigma(k)=f[n-1]*n
ans=g[n]/f[n]
没有想象中辣么难QAQ
设d[i]表示i到其所在子树的最远的点的距离。显然每一棵树与其他树相连的必然都是同一个点,且必然是d[i]最小的那个点。
然后把每棵树缩成一个点,点权为其最小的d[i]。
那么最后一定是构成一个菊花图,且中间那个点必然是点权最大的那个点(因为本来它内部就大,我们要尽量让其他点到他内部某个点尽量小)。
dp[i][a1][a2][b1][b2]表示前i个食品,第一个矿的最后分到的两个是a1,a2,第二个矿最后分到的是b1,b2
一开始题目没读懂,但是读懂以后你就会发现这就是最小生成树
为啥呢?考虑kruscal的过程就知道了,使两个点联通的最大路径最小就是最小瓶颈生成树,就是最小生成树对吧,
然后可以用倍增维护路径最大值,但是为了学习kruscal重构树,我还是用重构树啦
在kruskal过程中,每次加边后,不直接连边,而是新建一个节点,节点的两个子节点分别为新边连接的两个联通块的根节点(并查集维护),节点的权值为这条边的权值。
那么它有一些性质:
1.是一棵二叉树;
2.父节点的值大于等于子节点(大根堆);
3.原图上两点间路径的最长边的最小值等于其lca的值;
那么这道题就可以建出kruskal重构树,后求出Lca即可。
先把n二进制分解一下
枚举1的个数,然后组合数+快速幂搞一搞就行啦
ZROI A. Letters
显然每个都可以状压一下,然后25的范围不就是爆搜嘛QAQ
显然pair排个序,然后和set一块lower_bound瞎搞对吧QAQ
看着别人程序YY了好久才想出来
首先如果不相交,显然每个圆只会+1个面,所以一开始ans初始化为n+1,然后统计有多少个圆从左到右被拦腰切开,就会贡献多少个+1
这个类似扫描线,排好序以后单调栈维护一下,那个bool数组表示这个圆有没有可能会被拦腰切开贡献+1了,0是有,1是没有
这一过程有点抽象,就是说设d[i]表示从1的X到i这棵树的最大高度,我们只往下不往上,允许负数
所以最后答案为E[n]-d[n]+X-d[n]
如果一条边长度都大于目标树的高度了就不考虑,否则如果调了以后会变成负的,可以先往上爬几步使得达到目标时高度为0
如果跳了以后高度大于树高,就现在这棵树上往下爬几步使得到达目标树时高度为树高
一开始竟然一点思路也没有,好歹也要想到一个n^2的算法鸭QAQ
设G[n]表示所求答案,
G[0]=0
G[n]=Σ(i=1 to n-1) F[i]*G[n-i] +F[n](这里把F[n]要拎出来单独加是因为F[0]=0)
=Σ(i=2 to n-1)(F[i-1]+F[i-2])*G[n-i] +G[n-1]*F[1] + F[n-1]+F[n-2]
=(Σ(i=1 to n-2)F[i]*G[n-i-1] +F[n-1]) + F[0]*G[n-2]+ (Σ(i=1 to n-3)F[i]G[n-i-2] +F[n-2]) +G[n-1]
=G[n-1]+G[n-2]+G[n-1]
=2G[n-1]+G[n-2]
大众化的思路就是在每一行用hash,然后二分边长
详见黄学长blog
luogu里看到一种dp写法,也很巧妙,TM的我怕是一种黄题解法都不会了???艹
https://www.luogu.org/blog/Miracevin/solution-p4398
Dilworth定理,了解了QAQ
对于本题,就是求最小链覆盖,=求最大反链(最大点独立集)
两个点不可达就是一个在另一个的右上方,所以按这个方向dp就行了
数据水的……n4的暴力都能过……,正解应该n2吧QAQ
首先连接矩形对角线,肯定是圆的直径对吧(圆周角为直角)
而两条直径确定一个矩形,所以我们只需要统计出共有多少个直径,然后C(cnt,2)就行了
怎么统计直径呢,直径所对圆弧为半圆,所以只要两点间距离为圆周长一半就可以了
BZOJ1801: [Ahoi2009]chess 中国象棋
对于这一类问题,因为我们每个棋子都是一样的,所以往往都不需要知道具体整个棋盘的状态
我们可以考虑一行一行放,然后一行最多只放2个棋子,这一就保证了每一行没有三点贡献
然后我们还要保证每一列没有三个对吧
dp[i][j][k]表示前i行有j 列 有1个棋子,有k 列 有两个棋子,所以有m-j-k列没有棋子,我们每次只往有0/1个棋子的列放棋子,这样也就保障了每一列也不会超过两个棋子
剩下的组合数学了对吧
就是爆搜,要注意保证了只有一解,所以找到答案以后可以exit(0)了
BZOJ3609: [Heoi2014]人人尽说江南好
艹,到现在都不是太懂
大概就是因为两个人不管谁想,都可以到达m,m,m……,n mod m的状态
所以能赢的人必会往这个状态转移
然后如果这个状态需要的次数是奇数次,先手赢,反之……
大概很多博弈论的题要先“猜”结论,然后验证
upd.ok啦,下午明白了
显然很像Huffman树对吧QAQ,k叉树,
每次选k个最小的合并,此时把k个并为1个节点,减少了k-1个,最后相当于把n个点并为1个,减少了n-1个,所以如果n-1不是k-1倍数,说明最后一层放不满,
这就很傻了,最小的一层竟然放不满!!我们可以放入k-1-(n-1)%(k-1)个权值为0的节点,这样就可以强行把其他节点挤到了那些位置
然后维护所有的权和和最大高度
水题,加起来如果是偶数,直接输出
如果是奇数,减去最小的奇数
只有n=1且a[1]%2==1的时候无解
首先肯定不是沙茶暴力连边n^2
之前ZROI有一道类似的,对于这种我们应该从怎样减少连边来考虑
首先如果两个点之间有一点x,y都在两点之间,那么显然这两点连边就不有了,应该借助中间点了
因为min(a,c)+min(b,d)<=min(a+b,c+d)
所以我们把它先按x排序,相邻两个间连边,再按y排序,相邻两个间连边,因为借助中间点跳不会比直接跳更差对吧(因为是取min相加)
一开始竟然一点思路都没有QAQ果然要多做题
裴蜀定理,ax+by可以组成的最小正整数为gcd(x,y)
所以答案就是gcd(v1,v2,……,vk)
我们把每个数分解因数,然后选出现次数>=k的最大的即可
无根树的计数,套路的上prufer序列
每一个度为d的点会在prufer序列里出现d-1次,总共有n-2个位置,由于每一个不同的prufer序列都对应一个不同的树,所以用一下有重复的排列数即可
乘法会爆long long,很套路,约分就行啦
记得考虑无解的情况
感觉暴力模拟都打不好鸭QAQ
E中如果存在两条边ac->cd和bc->cd
那么ac能连出的点和bc能连出的点应该是相同的
因为在D中都表示从c连向另一个相同的点