随笔分类 -  bzoj

摘要:裸二维树状数组。 输出的时候要记得容斥。 阅读全文
posted @ 2017-10-30 15:11 或是七一 阅读(97) 评论(0) 推荐(0)
摘要:统计一个数出现了几次。 然后枚举每个值,把它的倍数加上它的个数。 挺像埃拉筛法。 阅读全文
posted @ 2017-10-30 14:17 或是七一 阅读(108) 评论(0) 推荐(0)
摘要:典型数据结构题。 线段树。慢。代码复杂度高。 ST表。内存大,速度快,代码复杂度低。 由于询问一定是询问的最后几个中的最大值,所以我们可以维护单调性,保证栈顶到栈底单调递增。 输出时二分一下可以取的在栈中位置最底下的那个元素。 代码复杂度低。速度快。内存小。 先统计有多少次增加元素。 然后编号倒一下 阅读全文
posted @ 2017-10-30 13:59 或是七一 阅读(103) 评论(0) 推荐(0)
摘要:状态压缩DP。 假设一个二进制数1001,1就表示在这个位置放一个国王,0就表示不在这个位置放一个国王。 就可以保存每一行的状态了。 可以先预处理所有的单行可行状态,这样会快一点。 用位运算来判断是否可行。 设这一行状态为i,前一行状态为j。 i&(i>>1)=0就表示这一行不会有冲突。 i&(j> 阅读全文
posted @ 2017-10-30 13:20 或是七一 阅读(127) 评论(0) 推荐(0)
摘要:因为“出现了超过n div 2次即众数”,所以其他所有数出现的次数之和是小于众数出现的次数的。 于是把每个数和一个与它不同的数相抵消,剩下的就是答案。 还有一种比较容易想到的。 把一个数拆成二进制。 当一个位置上1的个数大于n/2时,那么答案的这一位就是1,否则为0。 阅读全文
posted @ 2017-10-30 12:49 或是七一 阅读(117) 评论(0) 推荐(0)
摘要:一看就想到BFS。 由于状态只有2^16个,所以直接状压。 建议用宏定义优化代码。 阅读全文
posted @ 2017-10-25 08:27 或是七一 阅读(155) 评论(0) 推荐(0)
摘要:匈牙利算法。 主要要加时间戳优化。否则很容易TLE。 阅读全文
posted @ 2017-10-24 20:43 或是七一 阅读(123) 评论(0) 推荐(0)
摘要:一看就知道是DP了。 注意要求字典序最小,所以要从后往前做最长下降子序列。 如果不加二分或者树状数组之类的优化应该会TLE的吧。 输出的时候找一下答案即可。 阅读全文
posted @ 2017-10-24 19:41 或是七一 阅读(122) 评论(0) 推荐(0)
摘要:treap的裸题,查找最近的数其实和插入的方法是一样的,可以写在一起,然而影响不大也就懒得写了。 treap的思想就是把二叉搜索树改为随机顺序插入,这样就不会被数据卡成一条链了。 主要由一个旋转操作来维护。这个操作网上有很多,就不多说了。 一个节点有两个量:key,value。 value表示这个节 阅读全文
posted @ 2017-10-24 14:37 或是七一 阅读(138) 评论(0) 推荐(0)
摘要:设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数组一个个推出来判断是否符合即可。 阅读全文
posted @ 2017-10-24 10:55 或是七一 阅读(121) 评论(0) 推荐(0)
摘要:最大匹配,但算时间复杂度是过不去的。 并查集加贪心。 贪心,两个数所在集合的根都没选我们就选小的。 如果有一个选了,那么就选另一个。 如果两个数在同一集合,那么说明出现了环,所在集合所有数都可以选了,于是把根赋值为可选。 注意根是所在集合中的最大值。 阅读全文
posted @ 2017-10-24 10:36 或是七一 阅读(96) 评论(0) 推荐(0)
摘要:枚举右下角,问题转化成求以(x,y)为右下角的n*n正方形中的极值。 我们可以先把这个n*n正方形拆成n行n列。 用单调队列可以很快求出每一个位置往左n个的极值。 然后存储下来再用单调队列再求一次,合起来就是一个n*n正方形。 感觉很难说清楚,可以配合代码理解。 阅读全文
posted @ 2017-10-23 19:32 或是七一 阅读(162) 评论(0) 推荐(0)
摘要:类似田忌赛马问题。 设浙江队的实力值为a数组,对手的实力值为b数组。 先把两数组从小到大排序。 如果a中最小的一个比b中最小的一个大,那就让他们两个打。 如果a中最大的一个比b中最大的一个大,那就让他们两个打。 如果二者都不是就让a中最小的一个和b中最大的一个打,注意判断两者有可能是相等的。 第二问 阅读全文
posted @ 2017-10-23 18:08 或是七一 阅读(95) 评论(0) 推荐(0)
摘要:由于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][ 阅读全文
posted @ 2017-10-23 17:46 或是七一 阅读(124) 评论(0) 推荐(0)
摘要:完全背包预处理再容斥。 符合条件的付款方法数=所有付款方法数-不符合的方法数。 所有付款方法数可以用完全背包求出。 根据容斥原理,不符合的方法数等于第一种硬币不符合的方案数+第二种硬币不符合的方案数+……-第一种和第二种硬币都不符合的方案数-第一种和第三种硬币都不符合的方案数-……+第一种和第二种和 阅读全文
posted @ 2017-10-23 13:18 或是七一 阅读(127) 评论(0) 推荐(0)
摘要:没有什么是一个BFS或一个DFS解决不了的;如果有,那就两个一起。 裸的最小割,dinic算法水过。 注意时间比较紧,要加一些优化,比如到不了T的边就把它的dis赋值为0。 阅读全文
posted @ 2017-10-23 11:21 或是七一 阅读(148) 评论(0) 推荐(0)
摘要:题目其实就是求N范围内约数最多的数中最小的数。 若x=p1^k1*p2^k2……那么约数的个数就是(k1+1)*(k2+1)……的结果。 假如一个数分解质因数之后是一堆质数的一次方,那么我们肯定选素数小的才有可能是反素数。 所以别的素数就不用管了,前面十个素数的乘积就已经大于2*10^9了。 于是就 阅读全文
posted @ 2017-10-23 07:20 或是七一 阅读(104) 评论(0) 推荐(0)
摘要:先Tarjan缩点。 然后枚举每一条边,统计每一个强连通分量出度是否为0。 如果只有一个强连通分量的出度为0那么答案就是这个强连通分量中牛的个数。 否则答案就是0。 阅读全文
posted @ 2017-10-22 20:47 或是七一 阅读(105) 评论(0) 推荐(0)
摘要:经典贪心题。 先按照t2从小到大sort一遍。 设ans为前i个中最多选几个。 now为选ans个的情况下最少花费的时间。 用大根堆维护ans个中消耗时间最长的值。 如果可以直接选就直接选。把消耗的时间加到now中,把消耗的时间放进堆里。 否则如果消耗的时间比ans个中消耗时间最长的值小就把那个最大 阅读全文
posted @ 2017-10-22 20:37 或是七一 阅读(97) 评论(0) 推荐(0)
摘要:二进制拆分。 由2^0,2^1,2^2……可以组成小于等于这些二的倍数的和的所有数。 所以直接就水过了,不过我的代码写得比较差喽。 阅读全文
posted @ 2017-10-22 20:27 或是七一 阅读(95) 评论(0) 推荐(0)