8.28ccpc网络赛笔记

这篇博客探讨了如何使用双指针解决字符串中最长不重复子串和最短全字符子串的问题,同时介绍了如何构造平方和差序列。还涉及了二次函数最值的预处理和二分查找,以及数列中相等元素对计数的高效算法。此外,文章讲解了打砖块游戏的动态规划策略,并讨论了如何在有限操作下将整数减小至0的最优化方法,涉及最大质因数和线性筛技术。
摘要由CSDN通过智能技术生成
  • 求一个字符串中最长不重复连续子串、最短包含所有字符的子串(维护区间信息)
    可用双指针求解。
  • 多个不同长度的字符串相互循环对应,循环节的长度(对应多少次可以回到之前最近相同的对应)是所有字符串的长度的lcm。
  • 构造题:构造从1到k的平方之和(差),使其等于n
    可以利用 ( x + 1 ) 2 − ( x + 2 ) 2 − ( x + 3 ) 2 + ( x + 4 ) 2 = 4 (x+1)^2-(x+2)^2-(x+3)^2+(x+4)^2=4 (x+1)2(x+2)2(x+3)2+(x+4)2=4来构造。
  • 对于一个二次函数 f ( x ) ( x ∈ Z ) f(x)(x\in Z) f(x)(xZ),求它的x满足一定条件下的最值
    预处理出满足条件的所有x,存储在数组中,在数组上二分查找f(x)的对称轴。
  • 求一个数列中相等元素对的个数
    用map或排序统计出数列中每个元素出现的次数 n i n_i ni,答案就是 ∑ n i ( n i − 1 ) 2 \sum \frac{n_i(n_i-1)}{2} 2ni(ni1)
  • 打砖块
    每一列的敲打相对独立,所以用列作为dp的阶段。设dp[i][j]表示前i列用了j个子弹,所能获得的最大得分。考虑前i-1列和第i列,子弹在它俩中的分配可以进行状态的转移,则dp[i][j]=max(dp[i][j],dp[i-1][j-k]+v[i][k])(v[i][k]表示第i列用了k个子弹所能获得的分数)。
    如果不考虑赠送子弹,就是上述做法。由于赠送了子弹,造成v[i][k]的计算出现困难,第k发打的是不是全局最后一颗子弹,影响到v[i][k]的值。所以就分开讨论,加一个第三维,dp[i][j][0]表示最后一弹在前i列中打出时的最大得分,dp[i][j][1]表示最后一弹不在;v[i][k][0]表示最后一弹恰在第i列中打出时第i列打k枪的得分,v[i][k][1]以此类推。
    转移时,枚举最后一弹在前i-1列中、恰在第i列中、不在前i列中三种情况,相应地进行转移。
  • 给定 n,m,然后再给 m 个素数 p1~pm,问对于所有 i∈[1,n],将 i 减小至 0 的最小操作次数。每次操作允许将当前的 i 减小 i%p,p 为给定素数里的一个。
    1. 对于i>lcm(p1,p2,…,pm), a n s i = − 1 ans_i=-1 ansi=1,无法减小到0。
    2. 与其正着看减小,不如倒着看,x可以从哪些数转移而来?设p是x的质因数,则x可以由[x+1,x+p-1]转移而来。p取最大质因数时,区间最长。
    3. 最大质因数可以用线性筛(线性筛还可以求解最小质因数、最大因数等)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值