上一页 1 ··· 4 5 6 7 8 9 10 11 12 ··· 14 下一页
摘要: 相邻的一奇一偶(2i+1, 2i+2)不可能全都选。对于每一组这样相邻的一奇一偶,考虑选奇数、选偶数、都不选这三种情况,分别称为A,B,C。则问题相当于要求有多少长度为m的ABC串,其中有a个A,b个B,m-a-b个C,且不出现BA这个子串。先考虑BC,方案数是C(m-a,b)。再考虑插入A,方案数是C(m-b,a),所以总方案数是C(m-a,b)*C(m-b,a) 阅读全文
posted @ 2020-07-16 18:18 duyiblue 阅读(281) 评论(0) 推荐(0) 编辑
摘要: 区间DP。dp[i][j]表示只考虑被[i,j]完全包含的区间,能达到的最大价值。转移时枚举一个k(i<=k<=j),表示把1尽可能集中到第k列。设所有跨过k,且被[i,j]完全包含的区间数量为cnt(k),则新增的贡献就是cnt(k)^2。 阅读全文
posted @ 2020-07-16 11:48 duyiblue 阅读(229) 评论(0) 推荐(0) 编辑
摘要: 把一个排列看成若干个环(i连向p[i])。每次操作,相当于拆掉一个环,或者合并两个环。把所有环,分成同色环和非同色环两类。非同色环,总能用环长-1次操作消掉。同色环可以和别的环合并,变成非同色环。这个过程需要贪心:每次合并两个出现次数最多的颜色的同色环。 阅读全文
posted @ 2020-07-14 19:46 duyiblue 阅读(314) 评论(0) 推荐(0) 编辑
摘要: 考虑使用一个O(2^m*m)的状压DP解决这个问题。发现需要预处理出每个装修队集合,能装修的边集的并的大小。边集并,容斥一下,转化为求边集交。而边集交,只和点集交的大小有关。于是又转化为求点集交。考虑每个点的贡献,做高维后缀和即可。 阅读全文
posted @ 2020-07-14 10:07 duyiblue 阅读(271) 评论(0) 推荐(0) 编辑
摘要: 提交答案题。造计算机!慢慢磨,慢慢想,考验优化和卡常的技巧,也可以帮助深刻理解位运算 阅读全文
posted @ 2020-07-10 11:33 duyiblue 阅读(205) 评论(0) 推荐(0) 编辑
摘要: 如果只有一次询问,可以分治,每次考虑跨过中点的情况。预处理左半边后缀or和,右半边前缀or和,然后用two pointers求。发现前、后缀or和只会变化O(log a)次。用线段树维护,记录每个区间的答案,以及前、后缀or和(这O(log a)个段)。push_up和查询时,还用two pointers的方法合并左右区间。 阅读全文
posted @ 2020-07-08 22:13 duyiblue 阅读(412) 评论(0) 推荐(0) 编辑
摘要: 因为border的border还是border,所以一个串的最小border,也必须是无界单词。设dp[i]表示长度为i的无界单词数量,转移时,枚举最小border的长度(长度一定不超过floor(i/2))j,dp[i]可以从dp[j]转移过来。对第二问,可以逐位确定,每次对后面还未确定的位,做类似的DP。 阅读全文
posted @ 2020-07-05 20:48 duyiblue 阅读(281) 评论(0) 推荐(0) 编辑
摘要: 先考虑一个排列的情况。从边界入手,先把a[n]搞成n,同时要保证前面的数,相对大小关系不变。可以依次交换(pos[a[n]+1],n), (pos[a[n]+2],n),...,(pos[n],n)。完成这一轮操作后,转化为一个规模减1的子问题,继续做即可。当不是一个排列时,对相同的数,我们强行令位置小的数更小,这样可以把原序列转化为一个排列,且逆序对不变。 阅读全文
posted @ 2020-07-05 16:22 duyiblue 阅读(679) 评论(3) 推荐(4) 编辑
摘要: 4步以内,先手总能获胜。可以用逆推的思路来构造。 阅读全文
posted @ 2020-07-05 15:08 duyiblue 阅读(397) 评论(0) 推荐(0) 编辑
摘要: 每次把两个相邻、相等的字符删掉,判断一个串是否合法,就是看能不能删光。分治。只考虑要交换的两位置一个在[l,mid],一个在[mid+1,r]的情况。如果交换后合法,那么左、右两边分别操作后剩下的串应该是对称的。可以用哈希值来判断。枚举要交换的两个字符分别是什么。通过扫描+用栈维护,就可以求出左、右两边每个位置,在被修改后的哈希值。 阅读全文
posted @ 2020-07-04 15:09 duyiblue 阅读(343) 评论(0) 推荐(1) 编辑
摘要: 假设这n个数,最终就是从大到小严格降序的。可以做状压DP:对相邻两个数的大小关系(小于还是等于)进行状压。转移时枚举这个n个数下一个二进制位上分别是什么。发现S的这k次重复,每次的转移都是一样的。可以把转移预处理出来,然后做矩阵快速幂。 阅读全文
posted @ 2020-07-02 21:22 duyiblue 阅读(416) 评论(0) 推荐(2) 编辑
摘要: 发现,球会滚到大于号和小于号中间形成的“坑”里。用线段树维护区间信息:最前面的一个坑,最后面的一个坑,已经中间的坑里最大的大小。合并区间时大力分类讨论。为了支持反转,我们可以在一开始建线段树的时候,就处理好“反转前”和“反转后”两套信息。当需要把一个区间反转时,就把这两套信息交换一下即可。 阅读全文
posted @ 2020-07-02 14:11 duyiblue 阅读(385) 评论(0) 推荐(0) 编辑
摘要: 考虑枚举生成树上所有wi的公约数d,然后求此时的所有生成树的边权和。矩阵树定理,一般是用来求所有生成树的边权积之和的。直接求边权和,可以把边权改成一个多项式:1+wi*x,在新边权下,原本一个生成树的边权和,现在就是其乘积的一次项系数。发现更高次的项可以舍弃,也就是所有运算在mod x^2意义下进行。那么对多项式定义四则运算(难点是求逆)后,直接套用矩阵树定理即可。另外,枚举d时,需要特判一下边权是当前d倍数的边有没有n-1条,否则复杂度不对。 阅读全文
posted @ 2020-06-29 19:44 duyiblue 阅读(388) 评论(0) 推荐(1) 编辑
摘要: 状压DP,设dp[s]表示考虑了前|s|个位置,填了s里的这些数。转移时枚举下一个位置上的数i,考虑它和前面的数、后面的数,分别会产生哪些代价。时间复杂度O(2^mm^2)。发现对(s,i),这个代价可以通过递推,预处理出来,时间复杂度降为O(2^m*m)。但是预处理一个这样的数组,空间复杂度O(2^m*m),无法承受。可以按集合大小,从小到大,一边DP,一边处理代价数组。用滚动数组,或者stl-queue优化空间 阅读全文
posted @ 2020-06-28 10:24 duyiblue 阅读(619) 评论(3) 推荐(1) 编辑
摘要: 把f(k)拆开,对每一项单独算。后面的可以用二项式定理,难点在如何消掉k^i。可以每次求导再乘以x,效果等价于让每一项乘以k。这样就把k^i消掉了。还有一种方法是利用组合恒等式,拿组合数去消k,发现系数恰好是第二类斯特林数。当然,还有很多别的方法,例如考虑组合意义 阅读全文
posted @ 2020-06-26 20:06 duyiblue 阅读(418) 评论(2) 推荐(1) 编辑
上一页 1 ··· 4 5 6 7 8 9 10 11 12 ··· 14 下一页