摘要:
【题目链接】 点击打开链接 【算法】 线段树,注意数据量大,要动态开点 【代码】 阅读全文
摘要:
【题目链接】 点击打开链接 【算法】 树链剖分 【代码】 本题,笔者求最近公共祖先并没有用树链剖分“往上跳”的方式,而是用倍增法。笔者认为这样比较好写,代码可读性 比较高 此外,笔者的线段树并没有用懒惰标记,只要当前访问节点的线段总数为1,那么就下传 阅读全文
摘要:
【题目链接】 点击打开链接 【算法】 显然,越狱情况数 = 总情况数 - 不能越狱的情况数 很容易发现,总情况数 = M^N 不能越狱的情况数怎么求呢? 我们发现,不能越狱的情况,其实就是第一个人任选一种宗教,后面n-1个人,每个人都选 一种与前面一个人不同的宗教,所以第一个人有M种选法,后N-1个 阅读全文
摘要:
【题目链接】 点击打开链接 【算法】 线段树扫描线求周长并 【代码】 阅读全文
摘要:
【题目链接】 点击打开链接 【算法】 很明显,我们可以用线段树解决此题 只需维护区间最值就可以了 【代码】 阅读全文
摘要:
【题目链接】 点击打开链接 【算法】 我们知道,每个编号为a[i]都要被编号是a[i]的约数的牛拍一次头(除了它自己),因此,只需用类似于筛法的方式统计答案, 即可 【代码】 阅读全文
摘要:
【题目链接】 点击打开链接 【算法】 要求M,显然可以通过约数个数定理从1..N暴力计算答案,然而n最大10^6,这个算法的时间复杂度是 O(N * sqrt(N))的,不能通过此题 因此我们换一种思路 不妨考虑每个数对答案的“贡献”,若这个数为i,那么1..n中,共有n / i个数是i的倍数,那么 阅读全文
摘要:
【题目链接】 点击打开链接 【算法】 稍加分析可知,问题等价于“求1到n中,因子个数最多的数,若有多个,求最小的” 那么我们该怎么求这个数呢? 约数个数定理 : x = p1^a1p2^a2p3^a3...pn^an 则x的约数个数为 : (a1 + 1)(a2 + 1)(a3 + 1) ... ( 阅读全文
摘要:
【题目链接】 点击打开链接 【算法】 本题用map很好写,笔者用的是哈希的写法 【代码】 阅读全文
摘要:
【题目链接】 点击打开链接 【算法】 此题初看是大水题,只需调用std :: sort即可 但是,n最大500000,显然会超时 而且,内存限制1MB,我们连数组也开不了! 那怎么做呢 ? 我们发现,一个非众数和众数可以抵消,因此,暴力扫描一遍即可 【代码】 阅读全文