#D220712C. 小 C 的序列 题目描述 小 C 现在得到了两个序列 \(A = {a_1, a_2, ..., a_n}\) \(B = {b_1, b_2, ..., b_m}\)。他想知道对于每个 \(B\) 中 的数 \(b_i\),有多少个 \(A\) 的子序列 \(Al,r = {a_l, a_{l+1}, .., a_r}\) 满足所有数的最大公因数为\(b_i\)。 小 C 觉得 \(A
树的直径 定义 在一棵树上(默认无根树),定义 \(\operatorname{Dis}(u,v)\) 表示 \(u\) 到 \(v\) 的最短路径。 树的直径就是 \(\max\{\operatorname{Dis}\}\)。 求法 一般使用两遍DFS打法。(当然,也可以使用树上DP) 首先,任意选一个点 \(w\),从这个点出发,DFS整棵树,然后预处理 \(\operatorn
题面传送门 按秩合并并查集写错复杂度假掉以为自己被卡常卡了好久。 首先这种撤销题看上去就是把操作树建立出来然后dfs变成加入与撤销。 然后我们考虑对值域分块,这样看上去求\(k\)小值会可做一些。 首先我们需要确定每个询问在哪个块,这并不困难。我们考虑在dfs时用并查集维护,并查
题目链接 题目 题目描述 老李见和尚赢了自己的酒,但是自己还舍不得,所以就耍起了赖皮,对和尚说,光武不行,再来点文的,你给我说出来1-8的全排序,我就让你喝,这次绝不耍你,你能帮帮和尚么? 输入描述 无 输出描述 1~8的全排列,按照全排列的顺序输出,每行结尾无空格。 示例1 输入 No_Input 输出 F
位运算 位运算符 '&'(与),有0则0 '|'(或),有1则1 '^'(异或) ,相同为0,不同为1-----------位运算中常用 '~'(按位取反) ,有1为0,有0为1 '<<' (左移),先求该数的补码,再向左移动右边的位数,空位补0,最高位丢弃,最后将移动后的二进制数转为十进制数 '>>' (右移),先求该数的补码,再向右移动右边的
LG CF286E CF286E 考虑增量,每次从上一个字符跳 \(nxt\) 直到符合条件 用一个单调递增的单调栈维护答案集合的权值,将不合法的答案权值弹出后还要将所有的答案和 \(w_i\) 取 \(\min\) ,这个可以考虑将所有一样的权值暴力合并,总的复杂度是 \(O(n\log n)\)
好像是多项式最基础的算法(?,但是咕了比较久,现在学一下吧。 差值是啥 这个东西类似于 FFT 的转化过程,就是多项式点值和多项式系数的转化,简而言之就是解决下面的问题,P4781。 已知一个 \(n-1\) 次多项式的 \(n\) 个点值,\(f(x_i)=y_i\),已知 \(k\),求 \(f(k)\bmod 998244353\)。 \(n\le 2
https://leetcode.cn/problems/4sum-ii/solution/si-shu-xiang-jia-ii-by-leetcode-solution/ 时间复杂度和空间复杂度都是O(n2) func fourSumCount(a, b, c, d []int) (ans int) { mp:=make(map[int]int,0) for i:=0;i<len(a);i++{ for j:=0;j<
数据结构数组 在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。在C语言中, 数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数
我的垃圾做法好像和别人有些不同,分享一下。 题目传送门:luogu,CF。 规定:记序列 \(s\) 表示序列 \(a\) 的前缀和,\(highbit(x)\) 表示数 \(x\) 的最高位,序列 \(a\) 值域为 \(m\)。 首先考虑枚举一个端点找答案,不妨枚举 \(l\),然后寻找枚举 \(r\) 的性质来减少枚举。 考虑左端点 \(l\),不
题目: 1. 两数之和 难度简单14757收藏分享切换为英文接收动态反馈 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
上来先留个心眼看看模数是不是质数 是质数啊那没事了 注意到值域和节点数量都相当小。这引导我们去枚举某个节点或某个值。 我们枚举潜入的城市 \(u\),找出 \(d_v\) 比 \(d_u\) 大的所有 \(v\)。 可以知道我们要选的一定是一个连通块,这个连通块中只能恰好包括 \(k-1\) 个 \(v\)。
1.找gg 这个就是直接用字符串做就好了,注意对大小写不敏感,所以要先把所有的大写字母换成小写的(或者倒过来也行)。 时间复杂度是 \(O(n)\) 的。 代码: #include <iostream> #include <cstring> using namespace std ; int n , p[200005] , tot ; char a[200005] ; int main ( ) { c
设 \(f[n][m]\) 为将 \(n\) 个有标号元素放入 \(m\) 个有标号集合(不能空) 的方案数。 答案就是 \(\frac{\sum i\times f[n][i]}{\sum f[n][i]}\)。 来考虑这个鬼东西怎么算。。。容易发现 \(f[n][m]=n![x^n](e^x-1)^{m}\)。 那么有 \(n![x^n]\sum_{i=1}^{n}(e^x-1)^{i}=n![x^n]\fra
面对一个多维 \(\text{dp}\) 问题,根据维度之间联系的紧密程度,我们可以选择 维度之间紧密相关,只能直接枚举 维度之间完全无关,只是贡献通过某种形式相加,可以割裂为两个dp处理 介于 \(1,2\) 之间,不能割裂计算,但是可以将转移过程割裂为若干步来优化 e.g.1: 选区间1 问题描述
朴素筛:本质就是每一个合数n都可以被2-n-1里的数筛掉,这里就发现了一个问题就是,一个合数可能会被多次筛多次,这步可以进行优化。 埃氏筛:本质就是每一个合数n都可以被2-n-1里的素数筛掉,这里就是对朴素筛进行了优化,因为合数都会被素数筛掉,这样一来确实提升了时间复杂度,但是还是存在
归并排序是建立在归并操作上的一种有效的排序算法,1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。 一、基本思想 归并排序算法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干
4. 寻找两个正序数组的中位数 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (m+n)) 。 示例 1: 输入:nums1 = [1,3], nums2 = [2] 输出:2.00000 解释:合并数组 = [1,2,3] ,中位数 2 示例 2:
时间复杂度 O(f(n)) 算法需要执行基本运算的次数的 级别。 一,思考 目前个人认为:时间复杂度实际就是考量两种情况。 1. 循环 for(),while() 2. 递归 二,何为n 理论上指:问题规模。 拆开来说,就是for(),while()循环了n次,递归了多少次(递归的情况略微复杂)。 三,何为f(n) 算法执行基本运算的次
loj2772 反物质 正序无法得知最坏情况下当前实验生成的数量,考虑倒序 DP。设 \(f[i]\) 为当前有 \(i\) 个反物质,最坏情况下的最大利润,转移: \[f[i]=\max(10^{9}i,\max_{i+r_{j}\le a}(\min_{k=i+l_{j}}^{i+r_{j}}\{f[k]\}-c_{j})) \]维护 \(n\) 个单调队列即可转移,时间复杂度 \(O(nk
13_跳表 二分查找底层依赖的是数组随机访问的特性,所以只能用数组来实现。 今天就是对链表稍加改造,使链表也支持类似二分的查找算法,这种改造后的链表结构叫做跳表(skip list)。 Redis中的有序集合(Sorted set)就是用跳表来实现的。 跳表的结构 原始链表结构: 跳表的结构: 那怎么来提
NC16663 [NOIP2004]合并果子 题目 题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次
LeetCode 518. Coin Change 2 (零钱兑换 II) 题目 链接 https://leetcode.cn/problems/coin-change-2/ 问题描述 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0
题目 leetcode 241题,环形链表。https://leetcode.cn/problems/linked-list-cycle/ 思路 1、哈希表 建立一个哈希表,每次访问的节点都存储起来。如果某个节点在哈希表中已存在,说明有环。时间复杂度O(n),空间复杂度o(n) 2、双指针之快慢指针 快指针每次移动2个节点,慢指针每次移动1
1.1 概述 排序是将一组数据,依据指定的顺序进行排列的过程。 排序是算法中的一部分,也叫排序算法。算法处理数据,而数据的处理最好是要找到他们的规律,这个规律中有很大一部分就是要进行排序,所以需要有排序算法。 排序分为:内部排序和外部排序。 内部排序:是将需要处理的所有数据加载到