2019-09-16 17:22:28

总体感受:这次比赛的模版题也太多了吧,两条模版题没有想出来。总的来说,还是自己的刷题量还是严重的不够。

注意点

1)提升刷题量和覆盖率非常重要;

2)在碰到大数处理的时候,还是会出现一些问题,有两个路径吧,一个是使用long来测试一下;二是使用bigInteger。

  • 1191. K-Concatenation Maximum Sum

问题描述:

问题求解:

如果没有repeat操作,本题就是一个典型的dp问题,可以在O(n)内解决。事实上,如果进行了repeat依然可以在O(k * n)解决,但是本题的数据规模非常大,如果直接去计算那么必然会TLE。

这种repeat计算最大子数组和有个经典的解法,叫做 Kadens Algorithm 。使用该算法可以在O(n)的时间复杂度完成求解。

这个算法的核心思路是,如果sum of array > 0,那么中间就可以有k - 2个array,最后前后计算一下prefix和suffix即可;如果sum of array <= 0,那么中间必然不存在一个完整的array,那么最后的解就会出现array和横跨两个array的解中。

当然,本题最恶心的地方不只是这个算法本身,这里还有个大数处理的问题,本题采用的策略是使用long来保存数据,因为long的最长能保存10 ^ 18,本题中不会爆掉。

    public int kConcatenationMaxSum(int[] arr, int k) {
long mod = (long) (1e9 + 7);
long max_num = helper(arr);
if (k == 1) return (int)max_num;
long sum = 0;
for (int num : arr) sum += num;
long suffix = calcsuffix(arr);
long prefix = calcprefix(arr);
if (sum > 0) {
return (int) (Math.max((suffix % mod + prefix % mod + (k - 2) * sum % mod) % mod, max_num));
}
else {
return (int) (Math.max((suffix % mod + prefix % mod) % mod, max_num));
}
} private long helper(int[] nums) {
long mod = (int)(1e9 + 7);
long res = nums[0];
long dp = nums[0];
for (int i = 1; i < nums.length; i++) {
dp = Math.max(nums[i], nums[i] + dp);
res = Math.max(res, dp);
}
return res < 0 ? 0 : res % mod;
} private long calcsuffix(int[] nums) {
long res = Integer.MIN_VALUE;
long curSum = 0;
for (int num : nums) {
curSum += num;
res = Math.max(res, curSum);
}
return res;
} private long calcprefix(int[] nums) {
long res = Integer.MIN_VALUE;
long curSum = 0;
for (int i = nums.length - 1; i >= 0; i--) {
curSum += nums[i];
res = Math.max(res, curSum );
}
return res;
}
  • 1192. Critical Connections in a Network

问题描述:

问题求解:

本题也是一条模版题,是一条经典的求割边的问题,该问题有Tarjan算法,可以在O(n + e)的时间复杂度求解。

Tarjan算法的核心思路是维护两个数组discovery[],low[]。disc[]数组里存放访问节点的时间戳,low[]数组里存放与节点邻接的(不包含父节点)最小时间戳的节点。

每次比较父节点和子节点,如果子节点没有访问到时间戳小的节点,那么这两个节点之间必然有一条割边。

    int timestamp = 1;
public List<List<Integer>> criticalConnections(int n, List<List<Integer>> connections) {
int[] disc = new int[n];
int[] low = new int[n];
List<List<Integer>> res = new ArrayList<>();
List<Integer>[] graph = new ArrayList[n];
for (int i = 0; i < n; i++) graph[i] = new ArrayList<>();
for (int i = 0; i < connections.size(); i++) {
int u = connections.get(i).get(0);
int v = connections.get(i).get(1);
graph[u].add(v);
graph[v].add(u);
}
Arrays.fill(disc, -1);
helper(graph, 0, disc, low, -1, res);
return res;
} private void helper(List<Integer>[] graph, int node, int[] disc, int[] low, int prev, List<List<Integer>> res) {
disc[node] = timestamp;
low[node] = timestamp;
timestamp += 1;
for (int u : graph[node]) {
if (u == prev) continue;
if (disc[u] == -1) {
helper(graph, u, disc, low, node, res);
if (low[u] > disc[node]) {
res.add(Arrays.asList(u, node));
}
}
low[node] = Math.min(low[node], low[u]);
}

  

Contest 154的更多相关文章

  1. AtCoder Beginner Contest 154 题解

    人生第一场 AtCoder,纪念一下 话说年后的 AtCoder 比赛怎么这么少啊(大雾 AtCoder Beginner Contest 154 题解 A - Remaining Balls We ...

  2. Benelux Algorithm Programming Contest 2014 Final(第二场)

    B:Button Bashing You recently acquired a new microwave, and noticed that it provides a large number ...

  3. 「CometOJ」Contest #11

    Link Aeon 显然字典序最大就是把最小的字母放在最后 Business [动态规划] 简单dp dp[i][j]dp[i][j]dp[i][j]表示到第iii天,当前有jjj块钱,最后返还的钱最 ...

  4. Programming Contest Problem Types

        Programming Contest Problem Types Hal Burch conducted an analysis over spring break of 1999 and ...

  5. hdu 4946 2014 Multi-University Training Contest 8

    Area of Mushroom Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  6. 2016 Multi-University Training Contest 2 D. Differencia

    Differencia Time Limit: 10000/10000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tot ...

  7. 2016 Multi-University Training Contest 1 G. Rigid Frameworks

    Rigid Frameworks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  8. 1Z0-053 争议题目解析154

    1Z0-053 争议题目解析154 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 154.A database is running in ARCHIVELOG mode and ...

  9. hdu-5988 Coding Contest(费用流)

    题目链接: Coding Contest Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Ot ...

随机推荐

  1. windows dnsrecon

    缺了两个模块 第一个:https://pypi.python.org/pypi/netaddr 第二个:dnspython 找到下载后setup.py install就OK了,话说GFW真***了,用 ...

  2. Oracle中的列转行实现字段拼接用例

    文章目录 Oracle中的列转行实现字段拼接 场景 在SQL使用过程中经常有这种需求:将某列字段拼接成in('XX','XX','XX','XX','XX','XX' ...)做为查询条件. 实现 s ...

  3. Mac开发环境部署

    1. 安装 Xcode command line tools xcode-select --install 2. 安装 Homebrew 安装 Homebrew 之前,必须先安装 Xcode Comm ...

  4. log4p踩坑总结

    log4p可以方便的打印格式化日志,在实际应用时,因没有好好理解官网中的配置文件,导致出错了几次. 现总结如下: 1. 安装 pip3 install log4p 2. 查看配置说明,请参考https ...

  5. 国际控制报文协议ICMP

    国际控制报文协议ICMP ICMP简介 ICMP 用于主机或路由器报告差错情况和提供有关异常情况的报告(检测网络错误). ICMP 不是高层协议,而是 IP 层的协议. ICMP 报文的格式 ICMP ...

  6. Java 线程基础知识

    前言 什么是线程?线程,有时被称为轻量进程(Lightweight Process,LWP),是程序执行流的最小单元.一个标准的线程由线程 ID,当前指令指针 (PC),寄存器集合和堆栈组成.另外,线 ...

  7. 国产数据库适配publiccms开源项目

    金仓数据库适配 操作说明: 一.在程序的所有实体层添加schema=”public”(这里的public是根据数据库定义的模式) 二.切换数据库,修改配置文件cms.properties里面的cms. ...

  8. 前端的事件冒泡(例如点击一次onclick事件执行两次)解决办法

    问题概要: 当我运用antd 中 radio组件的时候发现radio组件是有bug的 就是你不能给他赋予id 和 value,同时也绑定不上onclick等事件.举个例子: 可以看到 你就算赋予了id ...

  9. Python——工厂模式

    目录 前言 一.简单工厂 二.工厂方法 抽象工厂 结论 参考 前言 工厂模式,顾名思义就是我们可以通过一个指定的"工厂"获得需要的"产品". 在设计模式中主要用 ...

  10. HTML5 基础知识(1)——基本标签

    ## HTML**概念**:是最基础的网页开发语言(Hyper Text Markup Langage 超文本标记语言) > 1.超文本:超文本是用超链接的方式i,将各种不同空间的文字组织在一起 ...