Hackerrank: Week of Code 36

Cut a Strip

题目简述:给定$n \times m$的矩阵$a[][]$,要求选择一个$x \times 1(1 \leq x \leq k)$的(连续)子矩阵并清零后,找到最大和的(连续)子矩阵。

数据范围:$1 \leq n, m, k \leq 380$。

题解:

子矩阵可以用四个参数表示$(x_1, y_1, x_2, y_2)$,其中$(x_1, y_1)$是其左上角,$(x_2, y_2)$是其右上角。

我们枚举子矩阵的$y_1$和$y_2(1 \leq y_1 \leq y_2 \leq m)$,令$c[i] = a[i][y_1]+\dots+a[i][y_2](1 \leq i \leq n)$。

接着枚举子矩阵经过的某行$x(1 \leq x \leq n)$,则经过第$x$行的子矩阵的最大和为

($c[1], \dots, c[x-1]$的最大后缀和)+($c[x+1], \dots, c[n]$的最大前缀和)+(把$a[x][y_1], \dots, a[x][y_2]$中连续不超过$k$个值清零的最大和)

前两个可以预处理得到,关键在于第三个部分。

注意到

(把$a[x][y_1], \dots, a[x][y_2]$中连续不超过$k$个值清零的最大和)=c[x]-($a[x][y_1], \dots, a[x][y_2]$中连续不超过$k$个的最小和)

后者可以利用单调队列求得。

时间复杂度$O(n^3)$。

注:单调队列求数组$a[1], \dots, a[n]$的长度不超过$k$的连续子数组最小和。令$s[i] = a[1]+\dots+a[i]$表示其前缀和。

即需依次对每个$1 \leq i \leq n$,求

$$ \min_{i-k \leq j \leq i} \{s[i]-s[j]\} = s[i] - \max_{i-k \leq j \leq i} \{s[j]\} $$

从而维护区间$[i-k, i]$的最大值即可。

Expert Computation

题目简述:依次给出$n$个二维点$(x[i], y[i])$以及$1 \leq z[i] \leq i$,且$x[i] < x[i+1]$严格递增。强制在线依次回答

$$ \max_{1 \leq j \leq z[i]} {x[j]*y[i]-y[j]*x[i]} $$

数据范围:$1 \leq n \leq 1,000,000.$

题解:

先不考虑强制在线,即允许离线回答,则可把询问按照$z[i]$从小到大排序,然后依次维护下凸壳,回答询问时,由于下凸壳斜率单调递增,二分答案即可。

若强制在线,则可持久化维护下凸壳即可。但$n$很大,常数以及空间复杂度承受不了,只能另辟蹊径。

注意到$x[i]$严格单调增,故所维护的下凸壳的各个历史版本(history version)中,每个点(如果这个点在当前下凸壳上的话)在下凸壳上的前驱是【固定】的。

对每个点,倍增地维护这个点的$2^k$次前驱,如$pre[i][k]$就可表示第$i$个点的$2^k$次前驱。

二分答案时利用倍增特点,可在$O(\log n)$复杂度内解决。

时间空间复杂度均为$O(n \log n)$。

原文地址:https://www.cnblogs.com/TinyWong/p/8445331.html

时间: 2024-08-11 04:27:01

Hackerrank: Week of Code 36的相关文章

【HackerRank Week of Code 31】Colliding Circles

https://www.hackerrank.com/contests/w31/challenges/colliding-circles/problem 设E(n)为序列长度为n时的期望值. \[ \begin{aligned} E(n-1)=&E(n)+\frac1{n\choose2}\sum_{0\leq i<j\leq n}2r_ir_j\=&E(n)+\frac1{n\choose2}\left[\left(\sum r_i\right)^2-\sum r_i^2\righ

hackerrank [Week of Code 33] Bonnie and Clyde

任意门 题意:给一个图,每次询问给三个点a,b,c,问是否存在一条从a到c,一条b到c的路径除c外无交点. 双连通分量缩点建出圆方树是必须的,然后我们需要判断c是否在a到b的路径上,或者c的某个相邻的方点(新建的节点)在a到b的路径上.最后这玩意判了很久就是一直不对,去膜了ccz代码--哦,lca(a,b),lca(a,c),lca(b,c)只有俩不同取值,异或一下就得到多余的一个,然后就很好判了. #include<cstdio> #include<algorithm> #def

【枚举约数】HackerRank - Week of Code 26 - Satisfactory Pairs

题意:给你一个正整数n,问你存在多少个正整数对a,b(a<b),满足条件:存在正整数x,y,使得ax+by=n. 就预处理出n以内所有数的约数,然后暴力枚举a,暴力枚举x,然后枚举n-ax的所有约数,判重,统计答案即可. #include<cstdio> #include<vector> #include<algorithm> using namespace std; typedef vector<int>::iterator ITER; vector

hackerrank Week of Code 34 Same Occurrence

之前也想到了利用前缀数组,记录每一位的0~i的值,但是这样效率并不高. 题解的方法是每出现一次这个数字,记录一下下标,然后通过求区间的交,这样优化就不会超时了. #include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<algorithm> #include<iostream> #include<queue> #includ

android MVP模式

1.视图 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 &g

MySQL Error Codes MYSQL的错误代码

OS error code 1: Operation not permitted OS error code 2: No such file or directory OS error code 3: No such process OS error code 4: Interrupted system call OS error code 5: Input/output error OS error code 6: No such device or address OS error code

【spoj705】 Distinct Substrings

[题目描述] 给定一个字符串,计算其不同的子串个数. [输入格式] 一行一个仅包含大写字母的字符串,长度<=50000 [输出格式] 一行一个正整数,即不同的子串个数. [样例输入] ABABA [样例输出] 9 [思路] 一看就知道是后缀数组题啦-但是我不会写QAQ..只好现学现用啦- 在字符串最后补上一个'$',不因为别的只因为它比‘A’还要小..不然你补ascII码是0的也可以.. 申请rank数组和sa数组,rank[i]=j代表后缀i排第j位,sa[i]=j代表排名第i的是后缀j.也就

「脑洞」图片转HTML(支持动画)

也许是受到很久以前看到的这玩意儿的原因:The Shapes of CSS 现在开脑洞写了个自动转换,顺便支持了动画……嗯,纯 CSS (:з」∠) 主要步骤就是用 Python 读图片,然后把像素全转写成 CSS 的 box-shadow ,最后构建一个完整的 HTML 文件输出. 然后用浏览器打开生成的 HTML 文件,就直接看到图片了,如果输入是一个文件夹的话,就以文件夹里面的图片为帧生成一个带动画的 HTML. 最新的版本就在这儿了: img2html 1 #!/usr/bin/env

【COCOS2DX-LUA 脚本开发之十二】Hybrid模式-利用AssetsManager实现在线更新脚本文件lua、js、图片等资源(免去平台审核周期)

转载自:http://www.himigame.com/iphone-cocos2dx/1354.html 首先说明一个问题: 为什么要在线更新资源和脚本文件!? 对于此问题,那要说的太多了,简单概括,如果你的项目已经在google play 或Apple Store 等平台上架了,那么当你项目需要做一些活动或者修改前端的一些代码等那么你需要重新提交一个新版本给平台,这时候你的上架时候是个不确定的时候,具体什么时候能上架,主要跟平台有关,你再着急,也没有用的. 那么如果你的项目是使用脚本语言进行