关键点在于:全排列中,任意两点u、v相邻的次数一定是(n - 1)! * 2次,即一个常数(可以由高中数学知识计算,将这两个点捏一起然后全排列然后乘二;或者用n! / C(2, n))。 这之后就好算了,每条边算一下子树size对吧,乘法原理就是贡献次数,乘以边权加一起就行了。 所以不是dfs就行了
喜闻乐见的数位入门第一道,这个dp[pos][state]记录的是第pos位如果没有限制的话(有限制当然要搜一搜暴力数了),前一位 放6 or 不放6 的方案数。也就是并不是要求的答案,其实就是记忆化一下,减小搜索的复杂度,跟dp没啥关系吧……
这个数位dp倒是没什么限制条件,只是需要在过程中把每个数字出现次数记录一下即可。记忆化返回时数学算出。框架还是套板子。
数位dp第二道~就当成搜索,套板子写了写。我写的dp[pos][pre][state0]记录的是当前pos位没有限制时、前面的数是pre时、前面是否都是0时的方案数。
笔者休息娱乐。
听队友说过结论:a^n + b^n = c^n在n > 2时无解。 勾股那里本菜数学不好直接暴举了Orz。 跟大家学一波勾股数的构造:a是奇数时,tmp = a / 2; b = (tmp + 1) * tmp * 2; c = b + 1; 举例:5、12、13. a是偶数时,tmp = a /
队友和大佬都什么几种情况啥的……我是把终点都插了,起点随便选一个,暴举答案莽A。
1.先预处理出在循环中某数前面的数是谁。 2.读入a数列时贪心选取最晚的父亲。 3.链上倍增预处理二进制祖先。 4.对于每个位置,预处理第n-1个祖先位置最早要从哪里开始,技巧上再顺手与前一位的最早位置取max,尽量缩小区间。 5.查询已经可做。
可以变换坐标:x' = x, y' = y - x ^ 2,如此之后可得线性函数x' * b + c = y',可以发现两点连边为抛物线,而其他点都在这条线下方才满足题意,故而求一个上凸壳即可。
题目传送 贪心方法 按边从小到大扫,先凑3个,没凑足的记录一下数量,后面大的优先跟这些凑,俩带走一个,多余的再凑3个,再……就这样走到最后即可。
题目传送 虽然线段树比较显然但是发现a数组并不好维护。考虑将a转化为好维护的数组b。 方法 这里我将k[1]设为0,对应着$$a[1] + k[1] INF) { C++ include include include include using namespace std; typedef lon
得到两个结论后为水题:1.进制一定是字母个数,否则这个表列不出来;2.对于某个字母,这行有几个两位数,这个字母的值就为多少。 判error直接暴力一遍即可。
题目传送 官方题解传送 1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 using namespace std; 5 6 const int maxm = 1e5 + 5; 7 int n, m, ans; 8 p
查了半天数组越界的RE,才发现自己把ch数组放结构体里是过大的……放全局就A了。 类似区间的dp比较显然,只是用trie树做了优化,使得可以在trie树里一边走一边往上加dp值,不必枚举以前的每个位置了,省去了很多不必要状态。复杂度就O(n*Trie)。 终于比刘汝佳的代码优雅了(弥天大雾)
对于某个位置i,i - Next[i]是循环节长度,i整除(i - Next[i])时是完整的几个循环元。
输入给出了最小循环节长度,暗示next数组。 然后自己按照自己的kmp板子逆着来一遍就好。
1.涉及负数时同时维护最大和最小,互相转移。 2.考场上最大最小混搭转移WA,赛后发现如果是小的搭小的,大的搭大的就可过,类似这种: 于是猜测原因的话可能是:最大和最小的不一定是同一种方案,而P1、P2、P3这三种情况转移到现态必须是同一种方案转移过来?
样例手写一写很容易发现规律(前后一样的串,则ans+=2),实现起来却忘了string的便捷性,其实根本用不到哈希。
第一种方法:可以二分最大天数订单的答案然后通过差分求一下是否可行。 第二种方法:无脑插一棵残缺的线段树板子即可:
放上刘汝佳的模板:
题目传送 官方题解 A.官方说是随机数据所以暴力线段树…… #include <bits/stdc++.h> using namespace std; const int maxn = 1e5 + 5; int N, L; class SegmentTree { public: #define ls
题目很简单,数据也很小,但是思路不妨借鉴:dp[i][j]代表以(i,j)为右下角的最长正方形边长。 类比一维里面设“以XX为结尾的最XXX(所求)”。 另外define不要乱用!尤其这种min套min,debug两行泪。 当然也可以无脑暴力乱搞了,二维前缀和+二分:
一看很像背包,然而值却是会随时间递减的(a - t*b),不能满足无后效性,于是考虑常用手段,先按照优先级排序。 这个优先级怎么定呢?列式子模拟一下。 洛谷题解说得很好了: 说来惭愧,其实这种“组合式”排序我也是第一次见,虽然很好理解: 最后记得各种longlong。
用solve(l, r, prefix)代表区间l开始r结束、带了prefix个前缀str[l](即l前面的串化简完压缩成prefix-1个str[l],加上str[l]共有prefix个)的最大值。 每层可以选择: 1.直接“提现”,把起始位和前面的“存款”直接提出来,再计算l+1~r区间的值;
最小生成树会多样的情况是:两个或多个边等长且连通同样的两个并查集块。 所以可以跑一遍克鲁斯卡尔,每次把当前等长的边数出来,注意不要边找边并查,因为有一部分边是正常跑生成树我们也不会要他的,这种直接跳了;还有一些,是因为你选择了第一个边,然后并在一起了,这时扫到后面的边时他自然会被抛弃。而这种比较委屈
题目本质:只有能做到一路过关斩将的勇者才能冒泡过来救出女主。 主要代码: 代码解释:一开始输入完就形成一个勇者集合,然而并不是谁都可以坚挺到最后的。从后向前贪心枚举每个人,这个人要是在勇者集合里,说明他一路挺过来了,ok你把女主冒泡上来以后就可以休息了,就ans++;否则视为阻挠之一(因为别人还得能
感觉书(Rosen的离散数学,机械工业的)上的做法有些逆向思维了,没有说明为什么要那样构造,以致大多数同学是背板子上的考场。然而其实用同样的思路我们完全可以使用一种让人可以理解的求解生成函数的方法。 听同学说期末考了两道,我就搞了搞,然鹅缓考时老师换题了一道都没考Orz……我个人的这种做法也就没能施
思路:一长段概率乘过去最后会趋于平稳,所以因为地雷只有10个,可以疯狂压缩其位置,这样就不需要矩阵乘优化了。另外初始化f[0] = 0, f[1] = 1,相当于从1开始走吧。双倍经验:洛谷1052. 这段代码j要倒着写否则先从i开始的话pos[i] - pos[i-1]就变了,我tm居然WA了一板
1.不要贪,缩小区间去dp就好。 2.预处理指数。 3.__int128可还行。
1.还是逆向。 2.状态是还剩红i黑j张时的期望,这样从0,0往R,B推。注意因为是逆着的,所以到了某一步发现期望为负时直接f[i][j]归零,意义是这之后(在递推中算是这之前)的都不摸了,到这就停(根据题意随时可以停手),所以相当于是从这个时候开始摸,所以为0. 3.滚动数组因为是无视j的,所以j
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号