IAISH 2022.11月赛 甲组

博客探讨了IAISH 2022.11月赛中的两道算法题目,T1是关于求解数列中无重复数字子串长度的问题,通过构建s数组和二分查找优化复杂度。T2涉及计算字符串子串中最大字符频差,使用前缀和与动态规划方法解决,但作者的解决方案在某些情况下超时。
摘要由CSDN通过智能技术生成

T1 不重复段

题目大意:给定长度为 n n n n ≤ 1 0 5 n\le10^5 n105 ) 的数列 a a a a i ≤ 1 0 6 a_i\le 10^6 ai106 )。有 q q q q ≤ 1 0 5 q\le 10^5 q105) 次询问,每次给定区间 [ l , r ] [l,r] [l,r] ,输出这段区间内最长的无重复数字的子串长度。

参照数列找不同一题的思路,先打出一个表 s s s ,表示对于给定的 l l l ,要使 [ l , r ] [l,r] [l,r] 无重复数字的最大 r r r 。如何实现详见上面的链接。

问题问的是给定区间 [ l , r ] [l,r] [l,r] ,输出这段区间内最长的无重复数字的子串长度。我们不放拿样例画个图,看看能发现什么(以第一个询问为例)。

在这里插入图片描述
然后,不难证明, s s s 数组是单调不下降的。而 l l l 又是递推 + 1 +1 +1 的,于是,对于 2 − s [ 2 ] 2 - s[2] 2s[2] 这条线段和 3 − s [ 3 ] 3 - s[3] 3s[3] 这条线段(如图),前者左端点比右者大,而且它们俩的右端点都超出了我们要求的区间 [ 1 , 3 ] [1,3] [1,3] ,于是我们只需要考虑 2 2 2 。同理,由于 s s s 数组的单调性, 2 2 2 之后的线段我们都不需要考虑。于是,我们可以采用二分查找,找到第一一个使得 q r ≤ s

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码存在一些错误,我已经修改了一下: ```java import java.util.HashMap; public class Manage { public static void main(String[] args) { HashMap<String, String> teacherClassMap = new HashMap<>(); // 存储老师和班级的对应关系 HashMap<String, String[]> groupMap = new HashMap<>(); // 存储班级和小组的对应关系 HashMap<String, String[]> classStudentMap = new HashMap<>(); // 存储班级和学生的对应关系 // 添加数据 teacherClassMap.put("小王", "一班"); teacherClassMap.put("小李", "二班"); teacherClassMap.put("小明", "三班"); groupMap.put("一班", new String[]{"一组", "二组", "三组"}); groupMap.put("二班", new String[]{"甲组", "乙组", "丙组"}); groupMap.put("三班", new String[]{"A组", "B组", "C组"}); classStudentMap.put("一组", new String[]{"一组学生1", "一组学生2", "一组学生3"}); classStudentMap.put("二组", new String[]{"二组学生1", "二组学生2", "二组学生3"}); classStudentMap.put("三组", new String[]{"三组学生1", "三组学生2", "三组学生3"}); classStudentMap.put("甲组", new String[]{"甲组学生1", "甲组学生2", "甲组学生3"}); classStudentMap.put("乙组", new String[]{"乙组学生1", "乙组学生2", "乙组学生3"}); classStudentMap.put("丙组", new String[]{"丙组学生1", "丙组学生2", "丙组学生3"}); classStudentMap.put("A组", new String[]{"A组学生1", "A组学生2", "A组学生3"}); classStudentMap.put("B组", new String[]{"B组学生1", "B组学生2", "B组学生3"}); classStudentMap.put("C组", new String[]{"C组学生1", "C组学生2", "C组学生3"}); // 遍历数据 for (String teacher : teacherClassMap.keySet()) { String className = teacherClassMap.get(teacher); System.out.println(teacher + " 管理的班级是:" + className); String[] groups = groupMap.get(className); for (String groupName : groups) { System.out.println(className + " 所有的组是:" + groupName); String[] students = classStudentMap.get(groupName); for (String student : students) { System.out.println(" 学生姓名:" + student); } } } } } ``` 这段代码将会输出老师、班级、小组和学生的对应关系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值