解题报告 (十三) 尺取法_尺取法课后作业 答 题 卡 上 一 题 下 一 题 2. k13629 字符计数 题目描述 给定一-程序员宅基地

技术标签: 算法  双指针  尺取法  数据结构  



尺取法 解题报告

PKU 2100 Graveyard Design

链接:PKU 2100 Graveyard Design
题意:给定一个数 n ( n ≤ 1 0 14 ) n( n \le 10^{14}) n(n1014),求所有满足 n = ∑ k = i j k 2 n = \sum_{k=i}^{j} k^2 n=k=ijk2 ( i , j ) (i,j) (i,j)

  • 可以把 i , j i,j i,j 看成是 [ 1 , n ] [1, \sqrt n] [1,n ] 内的数,并且永远满足 i ≤ j i \le j ij,维护一个区间平方和 s s s,然后执行如下操作:
  • 1)初始化令 s = 0 , i = 1 , j = 0 s=0, i=1,j=0 s=0,i=1,j=0
  • 2)自增 j j j,并且令 s = s + j 2 s = s + j^2 s=s+j2
  • 3)若 s > n s > n s>n,则 s = s − i 2 s = s - i^2 s=si2 i i i 自增;重复这一步直到 s < = n s <= n s<=n 满足后跳 3);
  • 4)若 s = n s = n s=n,则当前的 ( i , j ) (i, j) (i,j) 是一组可行解,记录;
  • 5)回到 2);
  • 最后输出所有可行解。

PKU 3061 Subsequence

链接:PKU 3061 Subsequence
题意:给定 n ( n < 1 0 5 ) n (n \lt 10^5) n(n<105) 个正数 a i ( a i ≤ 1 0 4 ) a_i ( a_i \le 10^4) ai(ai104) 和一个正数 p ( p < 1 0 8 ) p(p < 10^8) p(p<108)。找到一个最短的连续子序列,满足它的和 s ≥ p s \ge p sp

  • 可以把 i , j i,j i,j 看成是 [ 1 , n ] [1, n] [1,n] 的下标,并且永远满足 i ≤ j i \le j ij,维护一个区间和 s s s,然后执行如下操作:
  • 1)初始化令 s = 0 , i = 1 , j = 0 s=0, i=1,j=0 s=0,i=1,j=0
  • 2)自增 j j j,并且令 s = s + a j s = s + a_j s=s+aj
  • 3)若 s ≥ n s \ge n sn,更新可行解 ( i , j ) (i, j) (i,j),则 s = s − a i s = s - a_i s=sai i i i 自增;重复这一步直到 s < n s < n s<n 满足后跳 2);
  • 最后输出长度最小的可行解。

PKU 2739 Sum of Consecutive Prime Numbers

链接:PKU 2739 Sum of Consecutive Prime Numbers
题意:给定一个数 n ( n ≤ 1 0 4 ) n(n \le 10^4) n(n104),求所有满足 n = ∑ k = i j p k n = \sum_{k=i}^j p_k n=k=ijpk ( i , j ) (i,j) (i,j) 的对数(其中 p k p_k pk 代表第 k k k 个素数)。

  • 可以把 i , j i,j i,j 看成是第几个素数的下标,维护一个素数和 s s s,然后执行如下操作:
  • 1)筛选素数 p i p_i pi 后,初始化令 s = 0 , i = 1 , j = 0 s=0, i=1,j=0 s=0,i=1,j=0
  • 2)自增 j j j,并且令 s = s + p j s = s + p_j s=s+pj
  • 3)若 s > n s > n s>n,则 s = s − p i s = s - p_i s=spi i i i 自增;重复这一步直到 s < = n s <= n s<=n 满足后跳 3);
  • 4)若 s = n s = n s=n,则当前的 ( i , j ) (i, j) (i,j) 是一组可行解,记录计数器 c n t cnt cnt
  • 5)回到 2);
  • 最后输出计数器 c n t cnt cnt 即可。

PKU 3320 Jessica’s Reading Problem

链接:PKU 3320 Jessica’s Reading Problem
题意:给定 n ( 10 < n < 100000 ) n (10 \lt n \lt 100000) n(10<n<100000) 个数 a i ( a < 2 31 ) a_i ( a \lt 2^{31}) ai(a<231) 。找到一个最短的连续子序列,满足它包含所有的数。

  • 首先把所有的数进行离散化,使得每个数都能准确映射到下标 [ 1 , t ] [1,t] [1,t]
  • 然后把 i , j i,j i,j 看成是第 i i i个数的下标,维护一个哈希表,然后执行如下操作:
  • 1)初始化令 s = 0 , i = 1 , j = 0 s=0, i=1,j=0 s=0,i=1,j=0
  • 2)自增 j j j,并且自增 h a s h [ a j ] hash[ a_j ] hash[aj],如果 h a s h [ a j ] = 1 hash[ a_j ]=1 hash[aj]=1 则自增 s s s
  • 3)若 s = t s = t s=t,记录 ( i , j ) (i,j) (i,j) 作为其中一个可行解,并且自减 h a s h [ a i ] hash[ a_i ] hash[ai] i i i 自增;如果 h a s h [ a i ] = 0 hash[ a_i ]=0 hash[ai]=0,则自减 s s s,重复这一步直到 s < t s < t s<t 则跳 2);
  • 最后输出长度最小的 ( i , j ) (i,j) (i,j) 即可。

HDU 2158 最短区间版大家来找碴

链接:HDU 2158 最短区间版大家来找碴
PKU 3320 Jessica’s Reading Problem 加强版,做法类似。

HDU 2369 Broken Keyboard

链接:HDU 2369 Broken Keyboard
题意:给定一个长度为 n ( n ≤ 1 0 6 ) n(n \le 10^6) n(n106) 的字符串 和 m m m,求不同字符数不超过 m m m 最长子串。

  • 可以把 i , j i,j i,j 看成是第几个字符的下标,维护一个哈希表 h a s h hash hash,然后执行如下操作:
  • 1)初始化令 s = 0 , i = 1 , j = 0 s=0, i=1,j=0 s=0,i=1,j=0
  • 2)自增 j j j,并且自增 h a s h [ a j ] hash[ a_j ] hash[aj],如果 h a s h [ a j ] = 1 hash[ a_j ]=1 hash[aj]=1 则自增 s s s
  • 3)若 s > n s > n s>n,自减 h a s h [ a i ] hash[ a_i ] hash[ai] i i i 自增;如果 h a s h [ a i ] = 0 hash[ a_i ]=0 hash[ai]=0,则自减 s s s,重复这一步直到 s ≤ n s \le n sn
  • 4)若 s ≤ n s \le n sn,则当前的 ( i , j ) (i, j) (i,j) 是一组可行解,记录最大值;
  • 5)回到 2);
  • 最后输出最大区间的值即可。

HDU 2668 Daydream

链接:HDU 2668 Daydream
题意:给定一个长度为 n ( n ≤ 1 0 7 ) n(n \le 10^7) n(n107) 的字符串,求所有字符都不相同的最长子串。

  • 可以把 i , j i,j i,j 看成是第几个字符的下标,维护一个哈希表 h a s h hash hash,然后执行如下操作:
  • 1)初始化令 i = 0 , j = − 1 i=0,j=-1 i=0,j=1
  • 2)自增 j j j,并且自增 h a s h [ a j ] hash[ a_j ] hash[aj]
  • 3)如果 h a s h [ a j ] > 1 hash[ a_j ] \gt 1 hash[aj]>1 ,则自减 h a s h [ a i ] hash[ a_i ] hash[ai] i i i 自增;
  • 4)如果 h a s h [ a j ] = 1 hash[ a_j] = 1 hash[aj]=1,则更新 ( i , j ) (i, j) (i,j) 长度;
  • 5)回到 2);
  • 最后输出最大的区间的值即可。

HDU 5672 String

链接:HDU 5672 String
题意:给定一个长度为 n ( 10 ≤ n ≤ 1 0 6 ) n( 10 \le n \le 10^6) n10n106 字符串 s s s,问有多少子串包含至少 k ( 1 ≤ k ≤ 26 ) k(1 \le k \le 26) k(1k26) 个不同字符。

  • 用两个指针 ( i , j ) (i, j) (i,j) 代表某个阶段下子串指向的下标;
  • 对于某个子串,如果已经有 k k k 个不同字符,那么当前的区间 ( i , j ) (i, j) (i,j) 一定是满足条件的子串,并且 ( i , j + 1 ) , ( i , j + 2 ) , ( i , l e n − 1 ) (i, j+1),(i, j+2),(i, len-1) (i,j+1)(i,j+2)(i,len1) 也都是满足条件的子串,计数器加 l e n − j len - j lenj
  • 然后自增 i i i 继续判断可行性即可。

HDU 5056 Boring count

链接:HDU 5056 Boring count
题意:对于一个字符串,如果它的每个字母数都小于等于 k k k,则称其为 g o o d good good 串。给定一个长度为 s ( 1 ≤ s ≤ 1 0 5 ) s(1 \le s \le 10^5) s(1s105) 且只包含小写字母的字符串,求它的 g o o d good good 串的数量。

  • 用两个指针 ( i , j ) (i, j) (i,j) 代表某个阶段下子串指向的下标;
  • 如果某个子串 s [ i : j ] s[i: j] s[i:j] 满足条件,那么可以得出:以 j j j 为右端点的情况下,左端点只要大于等于 i i i,那么这个串一定是 g o o d good good 串,所以以 j j j 为右端点,满足条件的个数为 j − i + 1 j-i+1 ji+1
  • 所以整个调整过程就是: j j j 自增的过程,如果满足每个字母数都小于等于 k k k 的情况下,累加 j − i + 1 j - i + 1 ji+1;否则,自增 i i i,继续判断可行性。

HDU 6205 card card card

链接:HDU 6205 card card card
题意:给定一个 n ( n ≤ 1 0 6 ) n( n \le 10^6 ) n(n106) 个元素的环形序列,求它的最大子序列。

  • 由于是环形的,所以可以先拷贝一份,然后进行双指针 ( i , j ) (i, j) (i,j) 移动,只有当条件满足时左指针才右移,条件为:
  • 求和小于零 或者 j − i + 1 > n j-i+1 \gt n ji+1>n
  • 中途记录最大值即可。

HDU 6103 Kirinriki

链接:HDU 6103 Kirinriki
题意:定义两个长度均为 n ( n ≤ 5000 ) n (n \le 5000) n(n5000) 的字符串的距离为: d i s A , B = ∑ i = 0 n − 1 ∣ A i − B n − 1 − i ∣ dis_{A,B} = \sum_{i=0}^{n-1} | A_i - B_{n-1-i}| disA,B=i=0n1AiBn1i求找出最长的两个子串,满足他们不相交,且距离小于等于 m m m

  • 朴素方法为枚举长度,然后 A A A 串的起点, B B B 串的终点,模拟算一遍得出最优解,算法时间复杂度 O ( n 4 ) O(n^4) O(n4)
  • 定义两个双指针 ( a l , a r ) (a_l, a_r) (al,ar) ( b l , b r ) (b_l, b_r) (bl,br)
  • 1)枚举 k = n − 1 → 0 k = n-1 \to 0 k=n10
  • 2)初始化 d = 0 d = 0 d=0 a l = 0 , a r = − 1 a_l=0, a_r=-1 al=0,ar=1 并且向右移动 a r a_r ar 指针; b r = k , b l = k + 1 b_r=k, b_l = k+1 br=k,bl=k+1 并且向左移动 b l b_l bl 指针;
  • 3)每次 a r a_r ar 指针 右移, b l b_l bl 指针左移,如果 b l > a r b_l \gt a_r bl>ar d = d + d i s ( A a r , B b l ) d = d + dis(A_{a_r}, B_{b_l}) d=d+dis(Aar,Bbl);否则跳出循环,回到 2);
  • 4)如果 d > m d \gt m d>m d = d − d i s ( A a l , B b r ) d = d - dis(A_{a_l}, B_{b_r}) d=ddis(Aal,Bbr),并且 a l a_l al 右移, b r b_r br 指针左移;
  • 5)如果 d ≤ m d \le m dm,则更新当前 m a x l e n = m a x ( m a x l e n , a r − a l + 1 ) maxlen = max(maxlen, a_r - a_l + 1) maxlen=max(maxlen,aral+1) 为最优长度。
  • 然后把字符串反序,再做一次如上操作。
  • 最后,输出 m a x l e n maxlen maxlen 即可。

HDU 6119 小小粉丝度度熊

链接:HDU 6119 小小粉丝度度熊
题意:给定 n ( n ≤ 1 0 5 ) n(n \le 10^5) n(n105) 个区间,区间之间可能重叠,现在给出 m m m 个数,希望把区间补成连续区间,问最多能够补成多大的连续区间。

  • 首先,先按照区间左端点排序,然后利用贪心将所有区间转换成不相交区间;
  • 然后计算相邻两个不相交区间之间需要补多少数,可以利用前缀和,用 O ( 1 ) O(1) O(1) 的时间求出 [ i , j ] [i, j] [i,j] 区间之间要补多少数才能连续,然后利用双指针进行求和单调性求解即可。

HDU 1937 Finding Seats

链接:HDU 1937 Finding Seats
题意:给定一个 n × m ( n , m ≤ 300 ) n \times m (n,m \le 300) n×m(n,m300) 的 01 矩阵和一个数,求一个面积最小的子矩阵,保证它和大于等于 k k k

  • 首先用 s u m i j sum_{ij} sumij 计算出矩阵的前缀和。
  • 枚举 l , r l,r lr 作为子矩阵的左右端点,然后对上下端点采用双指针,从而转化成一维的求和单调性问题。

HDU 5178 pairs

链接:HDU 5178 pairs
题意:在 x x x 轴上有 n n n 个点 ( x i , 0 ) ( i = 0 , 1 , 2 , … , n − 1 ) (x_i,0)(i=0,1,2,…,n−1) (xi,0)(i=0,1,2,,n1),求有多少整数对 ( a , b ) (a,b) (a,b) 满足 ∣ x b − x a ∣ ≤ k ( a < b ) |x_b−x_a| \le k (a \lt b) xbxak(a<b)

  • 首先对所有数按照 x x x 轴递增排序;
  • 然后用两个指针 ( i , j ) (i, j) (i,j) 代表下标,并且不断自增 j j j 下标;
  • x j − x i > k x_j - x_i \gt k xjxi>k 时,自增 i i i 下标;否则以 j j j 结尾的满足条件的区间个数就是 j − i j-i ji,直接累加;

PKU 2566 Bound Found

链接:PKU 2566 Bound Found
题意:给定一个 n ( n ≤ 100000 ) n ( n \le 100000 ) n(n100000) k k k,然后是 n n n 个数字 x i ( ∣ x i ∣ ≤ 10000 ) x_i ( | x_i | \le 10000) xi(xi10000) 组成的序列,再给出 k k k 个数 t l t_l tl,要求对于每个 t l t_l tl,求出绝对值最接近 t l t_l tl 的区间。

  • 尺取法的前提是满足单调性, x i x_i xi 有可能是负数,所以这题需要进行一个思路转换。
  • 首先记录下前缀和 s u m i sum_i sumi,注意,需要将 s u m 0 = 0 sum_0 = 0 sum0=0 也加入进来。
  • 问题就转变成了求满足条件 ∣ s u m j − s u m i ∣ < t l | sum_j - sum_i | < t_l sumjsumi<tl 的最大的 ∣ s u m j − s u m i ∣ | sum_j - sum_i | sumjsumi,这时候需要满足的是 i < j i \lt j i<j,如果能够做到 s u m i < s u m j sum_i < sum_j sumi<sumj 恒成立,那么我们就可以采用尺取法了。
  • 所以可以对前缀和进行排序,注意排序的时候需要记录下原下标。
  • 然后就是对排序后的数组 s u m i sum_i sumi 进行尺取法了。

HDU 5806 NanoApe Loves Sequence Ⅱ

链接:HDU 5806 NanoApe Loves Sequence Ⅱ
题意:给定 n ( n ≤ 200000 ) n ( n \le 200000) n(n200000) 个数,求第 k k k 大的数 ≥ m \ge m m 的区间的个数。

  • 将原数组中 ≥ m \ge m m 的数变成 1,其它为 0,然后求出前缀和 s u m i sum_i sumi
  • 利用尺取法维护两个指针 ( i , j ) (i, j) (i,j),如果某种情况下 s u m j − s u m i ≥ k sum_{j} - sum_{i} \ge k sumjsumik,则所有区间 [ i + 1 , k ] ( j ≥ k ≥ n ) [i+1, k] (j \ge k \ge n) [i+1,k](jkn) 都满足上文所给的条件。所有以 i + 1 i+1 i+1 为左端点的满足条件区间数就是 n − j + 1 n-j+1 nj+1 个;累加到答案。
  • 并且 s u m j − s u m i ≥ k sum_{j} - sum_{i} \ge k sumjsumik 时,左指针 i i i 自增。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/WhereIsHeroFrom/article/details/115663723

智能推荐

安装确认书模板_房屋租赁合同模板及审查要点-程序员宅基地

文章浏览阅读292次。公司成立后,选择办公场所成为一项重要工作。一般情况下,公司的办公场所都不是股东的自有房屋,而是需要通过租赁来选择合适的场地用来办公。因此,房屋租赁合同将不可避免的出现在公司经营过程之中,关于审核租赁合同需要关注哪些风险点呢?笔者将在本文中对于一些重点条款进行梳理。(注:本文租赁合同模版来源于深圳市住房和建设局2019年11月制《深圳市房屋租赁合同书(非住宅)》)模板1.1甲方出租给乙方的..._安装完成确认书

JUC学习(五):ArrayList的线程安全问题分析与解决方案(vector、Collections、写时复制技术)_arraylist和vector的线程安全-程序员宅基地

文章浏览阅读5.2k次。目录一、异常演示二、解决方案 1、vector 2、Collections工具类 3、CopyOnWriteArrayList 写时复制技术三、写时复制技术 1、特性 2、原理一、异常演示循环创建线程,将数据放入集合的同时,从集合中读取数据。/** * list集合线程不安全问题 */public class ThreadDemo04 {......_arraylist和vector的线程安全

Typo: In word 'xxx' less... (Ctrl+F1) 去掉错误拼写检查提示_typo: in word 'bookindex' less... (ctrl+f1) inspec-程序员宅基地

文章浏览阅读7.4k次。解决步骤:File -> SettingsEditor -> Code Style -> inspections -> Spelling -Typo 把勾选状态去掉,点击 OK即可_typo: in word 'bookindex' less... (ctrl+f1) inspection info: spellchecker in

谷歌浏览器设置打开链接在新标签页打开(打开网页时不覆盖原网页)_谷歌浏览器打开新网页在新窗口打开-程序员宅基地

文章浏览阅读1.1k次。1、登录自己的谷歌账户,随便搜索一个内容(如果没有账户,估计也在右上角有齿轮的地方,请找一下),选中更多设置。2、其他设置,选择“在新窗口中打开搜索结果”_谷歌浏览器打开新网页在新窗口打开

操作系统中典型的调度算法_非剥夺式优先级调度算法-程序员宅基地

文章浏览阅读2.6k次。操作系统 调度算法_非剥夺式优先级调度算法

vue中 同步,异步获取后台数据并在另外的方法中调用该数据_vue中success的结果传出-程序员宅基地

文章浏览阅读1.2k次。【代码】vue中 同步,异步获取后台数据并在另外的方法中调用该数据。_vue中success的结果传出

随便推点

【无人车路径跟踪】基于神经网络的数据驱动迭代学习控制(ILC)算法,用于具有未知模型和重复任务的非线性单输入单输出(SISO)离散时间系统的无人车的路径跟踪(Matlab代码实现)-程序员宅基地

文章浏览阅读713次,点赞23次,收藏21次。摘要本文提出了一种基于神经网络的(NN-based)数据驱动迭代学习控制(ILC)算法,用于具有未知模型和重复任务的非线性单输入单输出(SISO)离散时间系统的跟踪问题。控制目标是使系统的输出在每次迭代过程中跟踪参考轨迹。因此,在每次迭代过程的每个相对时间点上,使用广义回归神经网络(GRNN)作为估计器来解决系统的关键参数,并使用径向基函数神经网络(RBFNN)作为控制器来解决控制输入。

Flask核心机制_runtimeerror: working outside of application conte-程序员宅基地

文章浏览阅读6.3k次,点赞2次,收藏4次。python编程快速上手(持续更新中…)python实战网上书店项目(Flask技术点More))1.首先写一段测试代码我们通过db.create_all(app=app)的方式解决了working outside application context的错误,下面我们来深究,这个错误出现的具体原因是什么。from flask import Flask, current_appapp = Flask(name)断点调试这里显示current_app=[LocalProxy]a = cur_runtimeerror: working outside of application context.

java中间件 - redis其他问题_master最好不要做任何持久化工作-程序员宅基地

文章浏览阅读1.1k次。Redis常见性能问题和解决方案?Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化。如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内。尽量避免在压力较大的主库上增加从库Master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,导致服务load过高,出现短暂服务暂停现象。为了Master的稳定性,主_master最好不要做任何持久化工作

美赛备赛资料大全_美赛资料-程序员宅基地

文章浏览阅读4.2w次,点赞246次,收藏2.1k次。目录1、美赛比赛网址及其介绍2、美赛摘要页说明3、美赛常用词语与语句4、美赛翻译注意事项5、美赛论文写作一些建议5.1 团队方面准备5.2 摘要表部分5.3 评委关注点6、组队要求7、软件与一些建模网址参考(1)写一篇建模文章大致需要如下技能:(2)数学建模算法总结(3) word小白教程数据资料:(4)1982—2018中国统计年鉴大全链接(5)美国人口普查数据大全链接(6)美国城市数据大全链接(7)全球统计数..._美赛资料

Flutter 网络请求的三种简单实现-程序员宅基地

文章浏览阅读285次。概述:本文主要讲解了flutter网络请求三种方式 flutter自带的HttpClient、 第三方库http 和 第三方库Dio 的简单实现 GET 和 POST请求,本文是笔者学习Flutter网络模块知识总结,若有问题还望不腻赐教。一.系统自带HttpClient1.使用中温馨提示1.1.导入库import 'dart:io'; // 网络请求import 'dart:co..._flutter http.client和httpclient

【MATLAB】滞后校正装置的设计_滞后校正设计-程序员宅基地

文章浏览阅读2.2k次,点赞10次,收藏42次。滞后校正的实质是利用滞后网络幅值衰减特性,将系统的中频段压低,使校正后系统的截止频率减小,挖掘系统自身的相角储备来满足校正后系统的相角裕度要求_滞后校正设计

推荐文章

热门文章

相关标签