BZOJ水题题解

14 篇文章 0 订阅

最近按AC数排序之后在从AC人数多的往少的刷。
如果有同学不知道怎么操作,请在搜索框里什么都不输入直接按回车,这样你会搜索到所有题目(会很慢,权限号除外)。然后点一下那个AC(也会很慢,耐心等一下),然后你就会看到AC数从小到大排序了,再按一下,就会变成从大到小了。

2463:http://www.cnblogs.com/iwtwiioi/p/4161161.html
1022:反nim游戏,SJ定理。
1006:弦图求完美消除序列后染色,学习了最大勢算法。
1202:带权并查集
3669:对a排序然后用lct对b做最小生成树
1046:做nlogn放入lis之后贪心
1011:将隔得远的一起算,误差分析。
1597:去掉包含(即 xi<xj && yi<yj )之后看得出来是个斜率优化
1303:从b的位置pos往左走记录每种k的个数(k表示比b大的 比 比b小的多多少,可以是负的),然后两边乘一下。加上两边为0的个数和b自己。
1269:splay\rope模板题
1834:最大流&&将从S出来的流量限制为n+k(n为原图最大流),给每条边新建容量无限,费用为扩容费用的边,跑最小费用最大流。
3295:将时间轴倒过来然后用cdq。
2152:点分治求权值和为3的倍数的路径。找到重心之后对于子树dp一遍,dp[i][j]表示到i这个点权值和mod3=j的路径条数。
1034:田忌赛马类贪心。先双方战斗力排序,我方的最优策略是,如果我方最差>对方最差,那么win1场,否则看我方最强,若>对方最强,那么干掉。否则用我方最弱vs对方最强,lose1场,然后继续贪心。不用考虑平局可能是因为,两场平的分等于一胜一负的分,而且一胜一负我方更有主动权(就是先把最弱送人头那个策略)
1095:动态点分治\树剖,详见QTREE4
2242:快速幂 & 费马小定理|exgcd & bsgs
2588:树上主席树裸题
1507:1269弱化版(好吧好像是1269是这题加强来的),splay\rope随便搞
1412:首先这题,,可能考语文啊。我一开始还觉得这题要围的篱笆确定了,就是BFS找联通快(excuse me??),结果意思是空格可以随便划分,所以会有很多个答案。解法:最小割,(格式,(u,v,cap)) (S,狼,INF),(羊,T,INF),(狼,空格,1),(空格,空格,1),(空格,羊,1),注意空格之间是双向边。
1207:听说这题 O(m2) dp能过???那就真成了大水题了,有个优化好像是,做i的时候,记录一下1~i-1的dp最大值,如果dp[i]已经被更新到>这个最大值了,就break。好像这样就变成了几十ms了?那我,,lis也这么做滋补自此啊。。
1179:tarjan缩点之后dp最长路。
1025:求一个长度为n的置换的循环节有多少种,首先可以发现等价于任意多个数,和为n(<=n也行,不够拿1凑),他们的lcm的种类,然后可以发现,这些数肯定互质(否则可以用更小的和也能凑出这个lcm),必定是 pk 的形式,然后1000以内的质数有168个,dp[i][j]表示前i个质数,和为j时有多少种lcm,每次枚举选当前质数的几次方,这个是接近常数的复杂度,简直无比快。
1833:数位dp套路,用f[i]表示有i位可以随便选的时候,每种数字会出现多少次(出现次数都是一样的),先把前导0算进去,然后最后来减。
3196:树套树的题,不想写了。
1042:容斥,没做出来,首先dp一次,dp[i]表示4种无限制使用凑成i面值的方式,然后开始容斥,比如说,硬币分别为c1,c2,c3,c4,个数分别为d1,d2,d3,d4,实际用了e1,e2,e3,e4,设第i种硬币超出限制(ei>ci)这个事件为Ai,那么就一共16种情况,减去A1,A2,A3,A4,加上A1&A2,A2&A3以此类推,怎么计算某一种的方案呢,比如说计算A1的方案,其实就是dp[s-c1*(d1+1)],保证我先取d1+1个c1,那肯定超过了,其他的类似
2006:用堆,增量地做最大值,这是一个套路,首先把后缀和算出来,处理出st表。然后对于每个下标i,找一个i作为左端点的时候,和最大的右端点(等价于求后缀和最小的位置)。弄一个结构体,存左端点,找到的右端点,和右端点的区间(一开始是i+1~n),和区间和,然后扔进一个堆,按区间和排序,每次拿一个出来,假设右端点区间为l~r,找到的右端点为pos,那么在l~pos-1和pos+1~r继续找和最大的右端点,然后把这两个都扔进堆里,取k次之后就ok了。
1927:类似于带权的最小链覆盖,因为之前对最小链覆盖理解的不是很深刻,发现必须得是DAG才行,建图:S与每一个右部点连边,费用为定位费用,容量为1,与每个左部点之间连边,费用为0,可以到达的左部点连到右部点上,容量为1,费用为路程长度,每个右部点与T连边,费用为0,流量为1。这里有一篇讲的极好
1037:其实这道题一开始我的想法有点偏差,只考虑了最后一个人往前,比ta异性多多少,其实应该用dp[i][j][k][l]表示前i个人,有j个男生,末尾开始的女生最多比男生多k个,末尾开始的男生最多比女生多l个,(注意后两个维大小只有20),转移的时候就枚举放男还是女,比如放男,k就得取max(0,k-1),l就是l+1之类的。
4034:dfs序。单点修改就是子树的ans修改,对于u子树加上权值val的话,对于一个点v,ans的变化是 (dep[v]dep[u]+1)val=(dep[v]+1)valdep[u]val 可以先把 dep[u]val 子树修改一下,因为对于每个子树内的点都一样,然后维护第二个树状数组,这个时候子树修改增加val,询问v点的答案时的时候, (dep[v]+1) 就好了。
2648:kdtree
2186:这题我也是煞笔了,最开始发现是要求1~n!里不含小于M的质因子的数的个数,然后我就去模仿用 μ 算欧拉函数,式子是这样的 Mi=1N!μ(i)i 我看了半天也没发现这东西就等于 ϕ(M!)N!M! 其实直观证明也是ok的,考虑 M! 以内与其互质的数,有 ϕ(M!) 个,然后根据辗转相除法,他们加上任意个 M! 不会影响最后的gcd,于是就对应 N!M! 个了。
3670:先kmp一遍算出fail数组以及cnt[i]表示i有多少个boarder,(等价于有多少个前缀等于后缀),然后再来一遍,这次有点不同,在匹配位置超过一半的时候需要沿着fail往回跳直到小于等于一半(向下取整),然后这个位置的cnt就是要求的这个位置的num。
3238:LCA??no,no,no。其实都是掩饰,实际上是要你求 ni=1i1j=1lcp(Ti,Tj) 单调栈,记录这个height控制了多长的一段区间,然后弄一个SUM记录单调栈里所有区间长度*height值的和。这题不太好解释,代码在这里
1452:直接拿c个二维树状数组就行了。
1072:啥?这题是状压?woc我直接暴搜搜过了,单组复杂度n!,得注意一点不然搞成 nn 就GG了,用双向链表把没有用过的串起来,这样每次枚举的复杂度是还剩下的数字个数而不是固定n。正解状压,dp[S][i]表示S集合里面的用过了,MOD的结果是i,每次枚举最低位或者最高位转移,会重,除以0~9的 cnt[i]! 就好。
2115:随便找一条路径当初值扔进线性基,然后找出所有环扔进线性基,找出最大的异或和,好文戳这里
2154:套路的莫比乌斯(懒到不想写式子)
1044:你只需要知道这题 O(nm) 可以过,剩下那个单调性优化我相信肯定想得出来
1305:建图之后,二分场数,看最大流满不满。
1057:先按国际象棋的样子,反色一下(比如(1,1),(1,3),(1,5),(2,2)都要反色),然后变成求最大全0子矩阵和最大全0正方形,这就是个经典问题了,悬线法。
1787:本来这题想做成 O(n) 但是发现没法,我自己的解法是用 O(nlogn) - O(1) 的LCA转RMQ。其实集合点必定是三个LCA之一。
1084:dp[i][j][k]表示上边一行取到i,下边一行取到j,取了k个矩形的最大收益,枚举往前取了多少,当且仅当i==j的时候可以取宽度为2的矩形。
1069:找到凸包之后,旋转卡壳,找出离每对对踵点所在直线最远的两个点(这个可以O(n)的),更新答案即可。
1143:yy一下,答案等于最小链覆盖的数量。因为先把图反向,任意两个点不在一条链上肯定是组解,在一条链有两个点上肯定不合法,于是得证,每条链放一个即可。

1858:线段树,只是tag多一点信息多一点(这还算比较正常的线段树了)
1934:最小割,u,v是一个人拆出来的两个点,如果一个人赞成那么连(S,u,1),(v,T,0),否则连(S,u,0),(v,T,1),在S集表示反对,在T集表示赞同,如果要换选择需要付出1的代价,如果(i,j)是好朋友,那么连( ui , vj ,1),( uj, v_i$,1),表示如果要在不同的集合需要1的代价。
1103:dfs序+树状数组,显然一条边只对某个子树内的信会有影响。
2435:dp一遍找出所有子树的size即可。
1085:IDA*搜索,估价函数是没在正确位置的棋子的个数。
1067:这题比较迷,先预处理每年往左往右遇到的第一个比它降雨量多的年份,三种情况,第一,两个端点降雨量都已知,比较一下看右端点的左边第一个是不是左端点,如果不是直接false,如果是,那么如果这段区间内的年份都已知,那么为true,否则为maybe,第二种情况,有一个端点已知,看一下中间有没有比已知那个端点降雨多的,如果有则为false否则为maybe,第三种,两个端点都未知,直接maybe。
1800:煞笔题啊。。直接找一下有多少条直径,如果有k条那么ans=k*(k-1)/2
1876:高精度辗转相减,orz能写高精除的大神们,注意一个小优化,如果a,b都为偶数,那么gcd(a,b)=2*gcd(a,b),这样可以减少很多减法次数,大概可以降到log级别,麻麻再也不用担心我TLE了。
3527:听说系统总能量总是往低的方向走的,然后你就模拟退火就ok了。
3289:莫队+树状数组。求区间逆序对。
1093:可以发现,只要求最大的话,强连通分量是一定会被整个选进去的,然后除了强连通分量之间,肯定是一条链的形式,所以tarjan缩点之后dp最长路就ok。
3134:套路的高斯消元,只要算出每条边的期望经过次数然后贪心地分配即可,边的期望经过次数不太好算,可以先算点的,一个高斯消元的模型,注意1号点的方程要单独+1,因为他是出发点,解出来之后,对于边(u,v),期望经过次数是cnt[u]/d[u] + cnt[v]/d[v] (cnt表示期望经过次数,d表示度数)注意一下走到n号点就结束方程中不能出现n号点走过来的情况。
1293:滑动窗口,如果有颜色没出现,++R,如果所有颜色都出现过,尝试++L,直到我如果再挪动L会少包含一种颜色,更新答案。
2326:没想到吧?我还以为是什么只跟最后几位有关的神奇结论,事实证明我就是个煞笔。这是道矩乘,说到是矩乘大家应该都会了233,我再提示一下初始矩阵(不是要乘的转移矩阵),是个3*1的(方式不同qwq1*3也ok的),第一行是一个数sum表示当前的和,第二行是一个数n表示下一个数要接啥,第三行是一个1,再小小提示一下这题需要九次矩阵快速幂,因为位数不一样的时候是没办法一起做的。
1607:这个直接用最原始的nlogn筛法来一遍就好了。。
2007:题面有毒推荐noi原始题面,然后这题是个最小割,,意思就是说存在最优解使得每条路h的变化不是1就是0,而且最后一定是沿某条线割开,这边海拔全是1那边全是0,这个边的数量级好像有点大,不能直接跑,需要转最短路。(而且这个又是双向边,注意一下)
1054:直接BFS判个重吧。。
1079:这题比较好,体现了dp中一个比较重要的思想叫,用最少的状态记录所有需要的信息。这题直接dp[i][a][b][c][d][e]表示,剩一个能涂的颜色有a种,剩两个个能涂的颜色有b种,以此类推,上一个填的是剩i个的,然后转移的时候注意,比如说你要选剩一个的,此时i又为2,看起来有a个能选,实际上上一次你选的是剩两个的某种,然后涂了上一个,然后它就剩一个了,所以只有a-1个能选。
1076:刷新我对期望的认知的一道题。为什么期望不能正着做,基本上所有解法都是倒着dp的?因为期望一般是对于某种最优策略,如果你从最开始正着dp,你采用最优策略做出的决策的dp值已经散落到五湖四海去了,状态也是多得不得了根本没法算答案,倒着推呢,更像是很多最终状态一步步倒推回来变成一个初始状态,这样他的dp值就是答案了。对于这道题,dp[i][S]表示我在第i次,我在1~i-1次的时候还需要至少把S集合中的物品拿一次的最大期望值。诶,,之所以这么说是因为是倒着dp的,其实更易于理解的方式是,我到了第i次我之前已经拿的宝物集合为S,我后续最多还能拿多少钱,然后倒着dp,枚举出哪个,然后dp[1][0]为答案.
1196:戳这里看窝写的单篇题解
1483:突破点在段数只会减少不会增多,头一次听说链表能启发式合并,这题是每种颜色一条链串起来,合并的时候把链短的拆了合到链长的上面,这样复杂度是nlogn。。不过注意这样做了之后原来是col颜色的链可能颜色不是col了,需要数组记一个真实的col。
1433:按要求建图,,二分图最大匹配。
2748:直接dp[i][j]表示第i次的时候音量为j可不可行就ok。
1565:最大权闭合子图,植物的关系等价于,要拿一些价值必须先拿另外一些价值,不管是保护或者左右关系都是这样。但这题难点不在这里,这题图不是个DAG,意思就是说有的价值你永远拿不到,直接跑网络流会GG。得先跑tarjan把环找出来,然后把环上的点和它们间接保护的点清除掉再来跑最大权闭合子图。
3211:一个数开根最多loglogn次,最后会有很多点是1,所只要在线段树上多记录一个东西,表示我这个区间是不是全是1,然后开根的时候对于不是1的区间暴力开根即可。
2208:tarjan缩点,缩完之后是个DAG,跑dp即可。
3674:可持久化并查集,用启发式合并不路径压缩的话,每次合并只会改变一个点的祖先,也就是一个p数组的位置,直接用主席树实现一个可持久化数组就ok。
3668:从二进制最高位开始贪心,如果这位1,0都能选那么比较一下哪个更高,如果只能选0就直接算继续往下走。
2431:dp[i][j]表示有i个数了,逆序对数为j,每次考虑把i(i是最大的)放进去,会产生0~i-1个逆序对,列出dp方程前缀和优化一下即可。
1058:由于这题插入位置的特殊性,只需要记录每个位置的第一个和最后一个即可,维护最小值用set即可,这题有点卡常,手写可能会快一些。
2286:虚树裸题,,直接dp即可。dp[u]=min(g[v] ? INF:dp[v] , w(u,v)),g[v]表示是资源节点。

*

1566 关键在于把sigma(ai^2)转化为玩两次游戏最终状态相同的方案数,这也是一种幂次和的模型,然后dp即可。
3123 看见有树有连边,本来在往lct靠发现不行,后来发现只有连边,这个条件比较重要,于是将树启发式合并一下,暴力重构小的那一块树的主席树和倍增数组即可。
2732 先二分能通过的关数,然后学到了一种半平面交的模型,y1<=ax^2+bx<=y2,套一下之后做半平面交看交集是否为空即可。

2754 大多数做法是后缀数组优化暴力,但是能被卡掉,想了一个比较复杂但是卡不掉的做法,但是估计随机数据实际耗时比暴力慢。
2009 模型是匈牙利二分图匹配,最大流做不了,网络流复杂度玄学,匈牙利本来是O(nm)但是远远跑不满。
1415 预处理双方分别在i,j点时猫的下一次走向p[i][j],然后所有状态连成一个DAG,然后用记忆化搜索做一下期望dp。

4300 脑洞题,开32的数组维护二进制这一位是1的最大可转移过来的子序列和长度。做dp。
3200 首先注意sum(i)的大小比较小,然后变成了一个比较简单的数位dp,统计1~n中二进制位上有k个1的数字个数。然后注意对幂取模的时候是%phi(MOD),还要注意10000007不是个质数。
3944 模型是杜教筛。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值