水题记录

众所周知

水题就是我这种蒟蒻做不出来的题

注:夹杂着口胡,请慎重食用

hihocoder1751:

蒟蒻的想法:枚举$i$在第$j$位的贡献,即$sumlimits_{i} sumlimits_{j} inom{i - 1}{j - 1} * (j - 1)! * (n - j)!$

然而并不能优化到$O(n)$

考虑从大到小插入数,那么插入$i$时,有$(i - 1)! * n^{underline{i}}$的贡献

即$sum (i - 1)! * n^{underline{i}}$

化简后为$n! sum frac{1}{i}$

hihocoder1750:$r - l leq 10^6$,对$[l, r]$内的所有数进行试除,暴力判断因子个数即可

hihocoder1746:分$a$是不是$b$的祖先判断一下,然后取去除$a, b$端的子树相乘即可

hihocoder1743:状压$2^k$然后套个矩阵快速幂即可

hihocoder1738:线段树优化建图后拓扑图dp

hihocoder1730:并查集维护相同,set维护不同,启发式合并set

hihocoder1726:二分找到答案所在的间隙后,加加减减输出即可

hihocoder1722:

考虑two-pointer,维护最小值和最大值指针,随着最小值指针的递增,那么最大值指针也会递增

可以在$O(nm)$的时间内维护每行中有多少个数出现,然后更新即可

hihocoder1718:把要求的序列分为3段去dp,转移时用线段树优化即可

hihocoder1714:设$f[i][0 / 1]$表示第$i$个来了或者没来的最大酒量,然后去dp

hihocoder1711:

发现两个评论框只要撞到了一起,那么久永远在一起了,并且一个评论框只会被撞一次

我们可以用带权并查集维护一个联通块内的距离,用set维护全局的联通块

hihocoder1710:拿线段树直接维护左右最长等差连续子序列和公差即可

hihocoder1706:

$f[i][j]$表示选出$i$个数,其中有$j$个2没有匹配时,某尾最多有几个零

相应地有$g[i][j]$表示有$j$个5没有匹配,转移时注意一下即可

hihocoder1703:

中序遍历:左中右,前序遍历:中左右

实际上确定字典序的过程相当于枚举根,枚举根后只要确定左右的不同的二叉树的形态,这是两个卡特兰数相乘

然后每一位慢慢确定就行

hihocoder1702:定义$f[x][y][k][0 / 1]$,为到$(x, y)$时,转了$k$次弯,现在向右还是向下走的最小代价,然后转移即可

hihocoder1698:

枚举刷了几天的题,之后为了保证顺序,乘上$a! * b!$后再划分即可

最终式子$sumlimits_{j} (n - j - 1) * a! * b! * inom{b - 1}{j - 1} * inom{a - 1}{n - j - 1}$

(没有细算,弄错了不要怪我

hihocoder1695:

先写个爆搜打个表,然后OEIS一下就可以发现规律

顺便膜一波证明:orz

hihocoder1693:

$i < j$,$A_i > A_j$,枚举数位一个维,三维问题,$O(n log^2 n)$解决

有没有更优美的解法呢?

hihocoder1692:

看着很迷,然而很简单

先枚举分母是谁,之后对每个分母判断离$k$最近的分子是谁,复杂度$O(n^2 log k)$

hihocoder1689:

先二分一个答案$v$

把$v$之前的边建出来后,看下能不能从$1$走到$n$或者从$n$走到$1$

hihocoder1685:

先枚举上边界和下边界,之后问题转化为1维问题

即求最大的$j - i + 1$使得$s[j] - s[i - 1] >= 0$,这个可以从左往右扫带个树状数组解决

复杂度$O(n^3 log n)$,hihocoder机子跑得快...

hihocoder1684:一个很裸的最长下降子序列

hihocoder1680:

真乱搞题.....直接确定出是落在每一层的哪个字母更新下来的区间中

往下转移的时候,由于一个字母最多变3个,暴力一下就好了....

hihocoder1677:平衡树裸题

hihocoder1673:

看起来就很套路....如果一个2 * 2的小矩阵都01间隔,那么给左上角赋值1

用悬线法做最大子矩阵即可,一些细节再判一下,复杂度$O(nm)$

hihocoder1672:

先把所有的包含区间去掉

那么我们一定会形成一个随着左端点递增,右端点递增的区间组

然后从头开始放整数,只需要放开头和结尾

hihocoder1665:需要一个支持区间查最大值和区间覆盖(值域递增)的数据结构,线段树即可

hihocoder1664:最大子矩阵和最大子正方形有什么区别呢?所以同1873

hihocoder1660:计算几何???

hichocoder1656:

某弱的做法:如果查询串为$(S, T)$,即查询前缀$S$和后缀$T$,那么转化为$S$ + # + $rev(T)$,其中$rev(T)$为$T$的反串

插入的时候,把一个串$S$,分成$|S|$个前缀$+ $# $+ rev(S)$,然后查询即可

复杂度$O(100 * n + 10 * m)$

空间复杂度$O(26 * 20 * 100 * n)$

另一种做法:考虑把所有的串和反串插入$Trie$树

那么,询问$(S, T)$在树上可以对应两个节点$(x, y)$

树上有答案的节点对只有$n * 10 * 10$个,我们可以直接预处理出来,用$set$存着

每次询问只需在树上匹配,然后调用$set$的值即可

可以考虑把$set$换成$hash$,复杂度能做到,时间$O(10 * 10 * n)$,空间$O(10 * 10 * n)$

hihocoder1655:

先二分一个答案$v$,考虑怎么判断

也就是求$sum [gcd(i, n) = 1]$

对其莫比乌斯反演,得到$sum [d | n] mu(d) * frac{m}{d}$

可以得到$n$的质因子后套用上式计算

复杂度$O(sqrt {n}  log n)$

hihocoder1652:咕咕咕咕咕咕咕咕

hihocoder1651:令$f[i][j]$表示$dp$到了第$i$位时,前面一共有$j$个相同的串的方案数,然后转移一下即可

原文地址:https://www.cnblogs.com/reverymoon/p/9911238.html