ssoj3991: 雪人(snowman)

【题目背景】 大佬WZY在AK NOIP 2018后,决定去冰天雪地的Y城堆雪人。
【问题描述】 WZY堆了N个雪人,每个雪人都有一个可爱度Xi,WZY认为两串雪人a1,a2…an与b1,b2…bm和谐当且仅当

  1. n=m
  2. a1-b1=a2-b2=…=an-bn
    WZY现在要从一堆雪人中选择两串雪人A=[l1,r1],B=[l2,r2](两串可以重叠,即若l1≤l2,l2可以小于等于r1),使得A和B和谐,现在WZY想知道对于所有的方案中,min(|l1-l2|,len(A))的最大值。 len(A)为A中所含雪人的个数。因为WZY还要准备AK JSOI 2019,所以他把这个问题交给了你。
    【输入格式】 输入文件名为snowman.in。 输入文件第一行为一个正整数N,表示雪人的个数。 输入文件第二行为N个整数:X1,X2,…XN。 【输出格式】 输出文件名为snowman.out。 输出文件仅一行一个整数,为min(|l1-l2|,len(A))的最大值。
    【输入输出样例1】
    snowman.in
    snowman.out
    全国信息学奥林匹克联赛(NOIP)复赛 提高组模拟赛
  • 11 -
    10 1 2 3 4 5 6 7 8 9 10
    5
    【输入输出样例1说明】 应选A=[1,5],B=[6,10],此时,min(|6-1|,5)=5; 【数据规模与约定】 Subtask 1 10%:?≤500。 Subtask 2 20%:?≤5000。 Subtask 3 50%:N≤100000 Subtask 4 20%:?≤500000,0≤??≤100000000
    题解:
    一方面,考虑满足条件的两串数列的性质:由于按照题目描述去判断的话,每次都要一个个元素地在数组中枚举,所以考虑将数组差分,差分后的两个相同的数组再加上它们后面的一个元素即为满足条件的数组。
    另一方面,考虑题目要求的max{min(|l1-l2|,len(A))},由于是最值问题,且涉及多个元素,故考虑二分。由于min(|l1-l2|,len(A))不好处理,故将其中一个转为条件,即长度为len(A),max(|l1-l2|)不小于len(A),求len的最大值。容易证明其单调(随len(A)减小,max|l1-l2|不降)。
    那么问题就转化为二分答案,判定是否有两个相同的字串,它们开头的距离不小于这个值,判定的过程要在O(N)内解决。由于是相同的串,故考虑哈希,之后一般的做法是将哈希值排序,取相同哈希值的开头差值的最大值,但这多了一个log。考虑用哈希表,将模一个数相同的串在一起即可。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值