sum

[Java高级](三)时间复杂度计算

懵懂的女人 提交于 2020-02-02 04:21:44
正值疫情,家中闭关,早起看新闻确诊人数已过万,不禁唏嘘,在此真切希望长风破浪会有时,直挂云帆济沧海。感激奋斗在一线的医护人员。 时间复杂度 1、概念 2、各时间复杂度介绍 2.1、O(1) 2.2、O(logn)、O(nlogn)对数阶时间复杂度 2.3、O(m+n)、O(m*n) 2.3.1加法法则 2.3.2 乘法法则 2.3.3 循环不仅与n有关,还与执行循环所满足的判断条件有关。 1、概念 时间复杂度是指 算法执行语句 执行的 次数 。 常见的时间复杂度有以下几种: 描述 时间复杂度 常数阶 O(1) 对数阶 O(logn) 线性阶 O(n) 线性对数阶 O(nlogn) 平方阶 O(n²) 立方阶 O(n³) n次方阶 O(mⁿ) 指数阶 O(2ⁿ) 常数阶 阶乘阶 2、各时间复杂度介绍 2.1、O(1) O(1) 是常量级时间复杂度的一种表示方法,并非只执行一行代码。 代码执行时间不是随着n的增大而增大,这样的代码的时间复杂度都是 O(1) 。 注意:通常只要算法中不存在循环、递归,即使代码有很多行,时间复杂度仍是 O(1) 。 2.2、O(logn)、O(nlogn)对数阶时间复杂度 int i = 1 ; while ( i <= n ) { i = i * 2 ; } 代码line3是执行次数最多的,只要算出第3行执行的次数,它 代表的就是整个代码的时间复杂度

Codeforces 33C Wonderful Randomized Sum

眉间皱痕 提交于 2020-02-02 00:25:41
题意 将序列的前面连续0个或多个数变成相反数,或者将后面连续0个或多个数变成相反数之后求整个序列和的最大值。 算法一 可以枚举1~i每个位置都取相反数之后,序列总和如何取最大,从前到后枚举一遍,从后往前再枚举一遍,然后取最大值。不过枚举效率太低,我们可以考虑先记录下每次枚举的最值 于是可以用: dp1[i]保存1~i位取反之后,前i个数能取得的最大和 dp2[i]保存i~n位取反之后,后i个数能取得的最大和 最后答案是 m a x { d p [ i ] + d p [ i + 1 ] } , 0 ≤ i ≤ n + 1 max\{dp[i] + dp[i+1]\}, 0 \le i \le n+1 m a x { d p [ i ] + d p [ i + 1 ] } , 0 ≤ i ≤ n + 1 d p 1 [ i ] = s u m [ i ] − 2 × m i n { s u m [ j ] } dp1[i] = sum[i] - 2 \times min\{sum[j]\} d p 1 [ i ] = s u m [ i ] − 2 × m i n { s u m [ j ] } ,其中sum[i]表示1~i个元素的前缀和, 1 ≤ j ≤ i 1 \le j \le i 1 ≤ j ≤ i dp2[i]类似,只不过从尾到头求解 我们可以 先求出前缀和sum[i]

「JSOI2014」序列维护

我们两清 提交于 2020-02-01 22:38:19
「JSOI2014」序列维护 传送门 其实这题就是 luogu的模板线段树2 ,之所以要发题解就是因为被 \(\color{black}{\text{M}} \color{red}{\text{_sea}}\) 告知了一种比较NB的 \(\text{update}\) 的方式。 我们可以把修改操作统一化,视为 \(ax + b\) 的形式,然后我们按照原来的套路来维护两个标记,分别代表 \(a\) 和 \(b\) ,那么我们的更新就可以这么写: inline void f(int p, int atag, int mtag, int l, int r) { t[p].sum = (t[p].sum * mtag % P + 1ll * atag * (r - l + 1) % P) % P; t[p].atag = (t[p].atag * mtag + atag) % P; t[p].mtag = t[p].mtag * mtag % P; } 然后我们就只需要写一个维护 \(ax + b\) 操作的修改就可以了。 其实我们还可以发现这个东西还可以用于区间赋值 \((a = 0)\) 。 简直很妙有没有 参考代码: #include <cstdio> #define rg register #define file(x) freopen(x".in", "r", stdin),

[NOI2014]购票

不羁岁月 提交于 2020-02-01 21:52:21
题目 读懂题目之后能写出一个dp方程, \(dp_i=dp_j+(d_i-d_j)p_i+q_i(d_i-d_j\leq lim_i)\) ,其中 \(d_i\) 是根路径前缀和 不难发现这个东西长得像斜率优化,需要建个凸壳来搞一搞;不难想到一个树剖+线段树维护的无脑做法,是 \(O(n\log^3n)\) 的,看起来和暴力差不多; 考虑有脑做法———— 有根树点分治 ,假设我们当前在处理一棵以 \(x\) 为根的有根树,流程大概长这个样子 找到重心 \(nw\) 将重心与其儿子断开,递归处理重心所在联通块(当然,根也在这个联通块中) 考虑 \(nw\) 到 \(x\) 路径上的点对 \(nw\) 子树内部点产生的影响 递归处理 \(nw\) 的子树 在这道题中,我们将重心子树中的点都搞出来,按照 \(lim_i -dis_i\) 从小到大排序, \(dis_i\) 是点 \(i\) 到根的距离;之后把重心到当前根上的点拿出来,按照距离排序;开个指针扫,把符合条件的点加入下凸壳即可,复查询的时候直接二分,复杂度是 \(O(n\log^2n)\) 代码 #include<bits/stdc++.h> #define re register #define LL long long #define max(a,b) ((a)>(b)?(a):(b)) #define min(a,b)

spark学习二

|▌冷眼眸甩不掉的悲伤 提交于 2020-02-01 21:02:16
SparkContext是编写Spark程序用到的第一个类,是Spark的主要入口点,用于连接 Spark集群、创建RDD、累加器和广播变量,是Spark程序的根本。 编写不同类型的Spark程序,使用的SparkContext是不同的 Scala 使用SparkContext Java 使用JavaSparkContext 开发一个简单的Spark程序: 第一步:创建SparkConf对象,设置Spark应用的配置信息 第二步:创建Spark Context对象 第三步:针对输入源创建一个初始的RDD(数据集),输入源数据分配到不同的区,形成初始的分布式数据集 SparkContext中,用于根据文件类型的输入源常见RDD的方法叫textFile()方法 今天安装Scala,并学习了Scala语言一些基本的语法, scala 方法声明格式: def functionName ([参数列表]) : [ return type ] 例: object add { def addInt ( a : Int , b : Int ) : Int = { var sum : Int = 0 sum = a + b return sum } } Scala的输入语句:val name = StdIn.readLine() 完成了实验二 import scala.io.StdIn object

leetcode13

孤街浪徒 提交于 2020-02-01 20:36:15
题目 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。 通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况: I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。 X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。 C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。 给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。 示例 1: 输入: “III” 输出: 3 示例 2: 输入: “IV” 输出: 4 示例 3: 输入: “IX” 输出: 9 示例 4: 输入: “LVIII” 输出: 58 解释: L = 50, V= 5, III = 3. 示例 5: 输入: “MCMXCIV” 输出: 1994 解释: M

leetcode 2 Add Two Numbers

这一生的挚爱 提交于 2020-02-01 17:33:19
题目内容 You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list. You may assume the two numbers do not contain any leading zero, except the number 0 itself. Example: Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) Output: 7 -> 0 -> 8 Explanation: 342 + 465 = 807. 分析过程 题目归类: 链表,迭代 题目分析: 最好的情况是能够走一趟,想到使用递归可以层层深入,先计算最外的数据。然后向内传进位来计算。麻烦的是如何判断两个链的长度 注意链之间和进位之间的关系。 边界分析: 空值分析 当都为null是返回null 当一方为null返回另一方。 循环边界分析 方法分析: 数据结构分析 链表需要控制什么时候指针指向null

30: 蟠桃记

杀马特。学长 韩版系。学妹 提交于 2020-02-01 16:46:22
30 蟠桃记 作者: xxx 时间限制: 1S 章节: 循环 问题描述 : 喜欢西游记的同学肯定都知道悟空偷吃蟠桃的故事,你们一定都觉得这猴子太闹腾了,其实你们是有所不知:悟空是在研究一个数学问题!什么问题?他研究的问题是蟠桃一共有多少个!不过,到最后,他还是没能解决这个难题,呵呵,当时的情况是这样的:第一天悟空吃掉桃子总数一半多一个,第二天又将剩下的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第n天准备吃的时候只剩下一个桃子。聪明的你,请帮悟空算一下,他第一天开始吃的时候桃子一共有多少个呢? 输入说明 : 输入数据有多组,每组占一行,包含一个正整数n(1<n<30),表示只剩下一个桃子的时候是在第n天发生的。 输出说明 : 对于每组输入数据,输出第一天开始吃的时候桃子的总数,每个测试实例占一行,行首与行尾无多余空格,行与行之间无空行。 输入范例 : 2 29 14 7 11 输出范例 : 4 805306366 24574 190 3070 代码: #include <stdio.h> int main() { int n, sum=1; while (scanf("%d", &n) != EOF) { for (int i = 1; i < n; i++) { sum = (sum + 1)*2; } printf("%d\n", sum); sum = 1; }

学习记录

大兔子大兔子 提交于 2020-02-01 03:34:37
目录 2019.1 2019.1.28 2019.1.31 2019.2 2019.2.3 2019.2.7 2019.2.10 2019.2.15 2019.2.25 2019.2.26 2019.3 2019.3.2 2019.3.5 2019.3.30 2019.4 2019.4.13 2019.4.21 2019.4.22 2019.4.27 2019.4.28 2019.4.29 2019.5 2019.5.4 2019.5.25 2019.5.26 2019.6 2019.6.16 2019.7 2019.7.19 2019.8 2019.8.24 2019.10 2019.10.14 2019.1 2019.1.28   去学习了一下 QFT 和 quantum phase estimation algorithm。 【集训队作业2018】【UOJ443】   直接上 quantum phase estimation algorithm 就好了。 2019.1.31   打了场 Codeforces Round #536 (Div. 2) ,又垫底了。 2019.2 2019.2.3 【WC2019】【LOJ2983】数树    题解 【WC2019】【LOJ2985】I 君的商店   最暴力的方法:    先用 \(2n\) 次操作找出一个 \(1\) 。   

TypeScript真香系列-函数

浪子不回头ぞ 提交于 2020-02-01 00:27:39
前言 TypeScript真香系列的内容将参考 中文文档 ,但是文中的例子基本不会和文档中的例子重复,对于一些地方也会深入研究。另外,文中一些例子的结果都是在代码没有错误后编译为JavaScript得到的。如果想实际看看TypeScript编译为JavaScript的代码,可以访问TypeScript的 在线编译地址 ,动手操作,印象更加深刻。 函数的基础 函数是JavaScript应用程序的基础,同样TypeScript也可以创建有名字的函数和匿名函数,不过TypeScript在JavaScript的基础之上添加了很多额外而且很有用的功能。 函数类型及定义 TypeScript中也可以以函数式声明和函数表达式来定义函数: // 函数式声明 function sum ( a : number , b : number ) : number { return a + b ; } //函数表达式 let sumTwo = function ( a : number , b : number ) : number { return a + b ; } ; 在上面的例子中,我们给函数添加了类型,给输入的参数和返回值都进行了严格的定义,这样在开发的时候,会避免一些问题的出现。当然我们也可以省略返回值类型,因为TypeScript可以根据返回语句自动的推断出返回值的类型,这被叫做“按上下文归类