随笔分类 - BestCoder
摘要:求从1点出发,走遍所有的点,然后回到1点的最小代价。每个点可以走若干遍。如果每个点只能走一遍,那么设dp[i][s]为走完s状态个点(s是状态压缩),现在位于i的最小花费。然后枚举从哪个点回到原点即可。但是现在每个点不止走一次,那么状态就不好表示了,但是,我们可以用floyd处理出任意两点的最短距离...
阅读全文
摘要:bestcoder round#45 1003 题,给定两个点,要我们求这两个点的树上路径所经过的点的权值是否出现过奇数次。如果是一般人,那么就是用lca求树上路径,然后判断是否出现过奇数次(用异或),高手就不这么做了,直接树链剖分。为什么不能用lca,因为如果有树退化成链,那么每次询问的复杂度是O...
阅读全文
摘要:1001给定数n,要我们求该数的二进制中有多少组1, 相邻的1称为1组, 直接位运算摸你即可 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #incl...
阅读全文
摘要:这题采用分治的思想首先,根据最后一位是否为1,将数分为两个集合, 集合与集合之间的lowbit为1,然后将每个集合内的元素,倒数第二位是否为1,将数分为两个集合,集合与集合之间的lowbit为2以此类推。首先为什么要将数组进行排序,排序的规则是根据数字二进制数,从右到左,第一个不同的数字进行排序,0...
阅读全文
摘要:比赛的时候是对于每个数,记录下来a[i], 并记录该树的下标hash[a[i]]然后枚举a[i]的倍数,如果a[i]的倍数存在(设为k*a[i]),那么vis[k*a[i]]是不为0的那么可以这样枚举得到最小的下标,但是比赛的时候不懂算时间复杂度,就随便提交了一下,没想到过了。后来看了下题解,原来时...
阅读全文
摘要:----- 有时候如果枚举起点超时,那么试试枚举终点。枚举每一个i为终点(0i内相同字母的个数不超过k1 while(true)2 {3 cnt[str[startPos]] --;4 if(str[startPos] == str[i])5 break;6 startPos++;7 }8 st...
阅读全文
摘要:dp[i][j] 表示以i结尾的长度为j的递增子序列dp[i][j] = sum(dp[k][j]) ka[j]如果只是单纯的循环for(j=2; j a[j]) dp[i][j] += dp[k][j-1];时间复杂度是O(n * n * m) TLE但是k循环可以用树状数组来优化,...
阅读全文
摘要:当要求递推数列的第n项且n很大时,怎么快速求得第n项呢?可以用矩阵快速幂来加速计算。我们可以用矩阵来表示数列递推公式比如fibonacci数列 可以表示为 [f(n) f(n-1)] = [f(n-1) f(n-2)] [ 1 1 ] [...
阅读全文

浙公网安备 33010602011771号