10 2017 档案
摘要:设f[i][j]为以a[i]为结尾,b数组前j个能组成LCIS的最大值。 if a[i]!=b[j],f[i][j]=f[i][j-1] else f[i][j]=max(f[k][j-1])(a[i]>a[k] && 1<=k<i)
阅读全文
摘要:统计一个数出现了几次。 然后枚举每个值,把它的倍数加上它的个数。 挺像埃拉筛法。
阅读全文
摘要:典型数据结构题。 线段树。慢。代码复杂度高。 ST表。内存大,速度快,代码复杂度低。 由于询问一定是询问的最后几个中的最大值,所以我们可以维护单调性,保证栈顶到栈底单调递增。 输出时二分一下可以取的在栈中位置最底下的那个元素。 代码复杂度低。速度快。内存小。 先统计有多少次增加元素。 然后编号倒一下
阅读全文
摘要:状态压缩DP。 假设一个二进制数1001,1就表示在这个位置放一个国王,0就表示不在这个位置放一个国王。 就可以保存每一行的状态了。 可以先预处理所有的单行可行状态,这样会快一点。 用位运算来判断是否可行。 设这一行状态为i,前一行状态为j。 i&(i>>1)=0就表示这一行不会有冲突。 i&(j>
阅读全文
摘要:因为“出现了超过n div 2次即众数”,所以其他所有数出现的次数之和是小于众数出现的次数的。 于是把每个数和一个与它不同的数相抵消,剩下的就是答案。 还有一种比较容易想到的。 把一个数拆成二进制。 当一个位置上1的个数大于n/2时,那么答案的这一位就是1,否则为0。
阅读全文
摘要:排列组合。 递推式C(n,m)=C(n-1,m)+C(n-1,m-1)。 容斥+前缀和记录一下即可,询问O(1)。
阅读全文
摘要:map。 map<int,int>::iterator表示一个从int映射到int的map的迭代器(可以当成是一个指针)。 由于map中是有序的,所以直接按顺序输出即可。
阅读全文
摘要:假设两块石头之间最多能跳了x次t。 最少跳s*x,最多跳t*x。 如果t*x-s*x>=9,一定可以跳到下一块石头前t块中的任意一块。 注意要排除掉s=t的情况,不然会T两个点。
阅读全文
摘要:一看就想到BFS。 由于状态只有2^16个,所以直接状压。 建议用宏定义优化代码。
阅读全文
摘要:一看就知道是DP了。 注意要求字典序最小,所以要从后往前做最长下降子序列。 如果不加二分或者树状数组之类的优化应该会TLE的吧。 输出的时候找一下答案即可。
阅读全文
摘要:treap的裸题,查找最近的数其实和插入的方法是一样的,可以写在一起,然而影响不大也就懒得写了。 treap的思想就是把二叉搜索树改为随机顺序插入,这样就不会被数据卡成一条链了。 主要由一个旋转操作来维护。这个操作网上有很多,就不多说了。 一个节点有两个量:key,value。 value表示这个节
阅读全文
摘要:设b数组表示这个位置有没有雷。 a[i]=b[i-1]+b[i]+b[i+1]。 b[3]=a[2]-b[2]-b[1]。 b[2]=a[1]-b[1]。 也就是说,只要知道b[1]就可以知道b[2]...b[n]的值。 于是直接枚举b[1]的值把b数组一个个推出来判断是否符合即可。
阅读全文
摘要:最大匹配,但算时间复杂度是过不去的。 并查集加贪心。 贪心,两个数所在集合的根都没选我们就选小的。 如果有一个选了,那么就选另一个。 如果两个数在同一集合,那么说明出现了环,所在集合所有数都可以选了,于是把根赋值为可选。 注意根是所在集合中的最大值。
阅读全文
摘要:枚举右下角,问题转化成求以(x,y)为右下角的n*n正方形中的极值。 我们可以先把这个n*n正方形拆成n行n列。 用单调队列可以很快求出每一个位置往左n个的极值。 然后存储下来再用单调队列再求一次,合起来就是一个n*n正方形。 感觉很难说清楚,可以配合代码理解。
阅读全文
摘要:类似田忌赛马问题。 设浙江队的实力值为a数组,对手的实力值为b数组。 先把两数组从小到大排序。 如果a中最小的一个比b中最小的一个大,那就让他们两个打。 如果a中最大的一个比b中最大的一个大,那就让他们两个打。 如果二者都不是就让a中最小的一个和b中最大的一个打,注意判断两者有可能是相等的。 第二问
阅读全文
摘要:由于m只会是1或者2,那么就干脆分类讨论,可以开两个namespace实现。 当m为1时。 设dp[i][j]表示前i个数中选了j个矩阵的最大值。 dp[i][j]=max(dp[i-1][j],dp[k][j-1]+sum[i]-sum[k])(0<=k<i)。 当m为2时。 设dp[i][j][
阅读全文
摘要:完全背包预处理再容斥。 符合条件的付款方法数=所有付款方法数-不符合的方法数。 所有付款方法数可以用完全背包求出。 根据容斥原理,不符合的方法数等于第一种硬币不符合的方案数+第二种硬币不符合的方案数+……-第一种和第二种硬币都不符合的方案数-第一种和第三种硬币都不符合的方案数-……+第一种和第二种和
阅读全文
摘要:没有什么是一个BFS或一个DFS解决不了的;如果有,那就两个一起。 裸的最小割,dinic算法水过。 注意时间比较紧,要加一些优化,比如到不了T的边就把它的dis赋值为0。
阅读全文
摘要:题目其实就是求N范围内约数最多的数中最小的数。 若x=p1^k1*p2^k2……那么约数的个数就是(k1+1)*(k2+1)……的结果。 假如一个数分解质因数之后是一堆质数的一次方,那么我们肯定选素数小的才有可能是反素数。 所以别的素数就不用管了,前面十个素数的乘积就已经大于2*10^9了。 于是就
阅读全文
摘要:先Tarjan缩点。 然后枚举每一条边,统计每一个强连通分量出度是否为0。 如果只有一个强连通分量的出度为0那么答案就是这个强连通分量中牛的个数。 否则答案就是0。
阅读全文
摘要:贪心题,每次肯定是选最小的两堆。 哈夫曼树裸题,用优先队列维护最小值。 单调队列。 先放入一个数组中从小到大sort一遍。 然后选择最小的两个合并,放入一个队列的队尾。 每次最小那个只有可能是数组的队首或者队列的队首。(队列中的数必然是有序的) 时间复杂度还是O(nlogn),但是常数似乎要小一些。
阅读全文
摘要:经典贪心题。 先按照t2从小到大sort一遍。 设ans为前i个中最多选几个。 now为选ans个的情况下最少花费的时间。 用大根堆维护ans个中消耗时间最长的值。 如果可以直接选就直接选。把消耗的时间加到now中,把消耗的时间放进堆里。 否则如果消耗的时间比ans个中消耗时间最长的值小就把那个最大
阅读全文
摘要:二进制拆分。 由2^0,2^1,2^2……可以组成小于等于这些二的倍数的和的所有数。 所以直接就水过了,不过我的代码写得比较差喽。
阅读全文
摘要:补集思想。快速幂。 总方案数为M^N。 不会发生越狱的方案数就是(M-1)^(N-1)*M。(第一个人随便选,后面的人不能选和前面一个人一样的宗教。) 可能会发生越狱的方案数=总方案数-不会发生越狱的方案数。 主要输出的时候可能减出来一个负数,所以要加上一个100003。 两种快速幂写法。 递归。
阅读全文
摘要:ANS=MAX/MIN。 先把边按照权值从大到小sort一遍。 按顺序枚举MIN,MAX需要尽量小,所以就是让S和T联通的最大边权最小。 这不就是最小生成树的性质吗? 于是直接Kruskal水过,直到S和T在同一集合就break。
阅读全文
摘要:中位数既然是b,那么在b左右两边比它大的数和比它小的数的个数必然要相等。 考虑把比b小的数赋值为-1,比b大的数赋值为1,b所在位置赋值为0。 做一遍前缀和,设b所在位置为w,那么问题转化为求sum[i]=sum[j](0<=i<w,w<=j<=n)的个数,开个桶来统计一下即可。 注意这个连续子序列
阅读全文

浙公网安备 33010602011771号