文章目录

  • problem
  • solution
  • code

problem

solution

  • 特判d=0d=0d=0,相当于寻找最长的一段数字相同的区间

  • 如果要满足公差为ddd等差序列

    • 区间内每个数在模ddd意义下同余
    • 每个数互不相同
  • 算法流程

    • 先将序列分成若干个同余mmm的子区间

      从左往右扫一遍

    • 对于同余的子区间,把所有数进行x−rd\frac{x-r}{d}dx−r​的操作

      转化为求公差为111的等差数列

    • 对于区间[l,r][l,r][l,r],需要增加的个数max⁡{xi∣l≤i≤r}−min⁡{xi∣l≤i≤r}+1−(r−l+1)\max\{x_i|l\le i\le r\}-\min\{x_i|l\le i\le r\}+1-(r-l+1)max{xi​∣l≤i≤r}−min{xi​∣l≤i≤r}+1−(r−l+1)

      满足增加个数≤k\le k≤k

    • 从小到大顺次枚举rrr,那么就是要最小化lll

      • [l,r][l,r][l,r]区间不重复

        可以通过map快速查到与xrx_rxr​值相同的点的位置,假设为pospospos

        则需满足pos<lpos<lpos<l

      • 加的数个数不能超过kkk

        max⁡{xi∣l≤i≤r}−min⁡{xi∣l≤i≤r}+1−(r−l+1)≤k\max\{x_i|l\le i\le r\}-\min\{x_i|l\le i\le r\}+1-(r-l+1)\le kmax{xi​∣l≤i≤r}−min{xi​∣l≤i≤r}+1−(r−l+1)≤k

        ⇕\Updownarrow⇕

        max⁡{xi∣l≤i≤r}−min⁡{xi∣l≤i≤r}+l≤k+r\max\{x_i|l\le i\le r\}-\min\{x_i|l\le i\le r\}+l\le k+rmax{xi​∣l≤i≤r}−min{xi​∣l≤i≤r}+l≤k+r

        用线段数维护wl=max⁡{xi∣l≤i≤r}−min⁡{xi∣l≤i≤r}+lw_l=\max\{x_i|l\le i\le r\}-\min\{x_i|l\le i\le r\}+lwl​=max{xi​∣l≤i≤r}−min{xi​∣l≤i≤r}+l

        设lll的下界为pospospos,则要在[pos,r][pos,r][pos,r]找最左边的lll,满足wl≤k+rw_l\le k+rwl​≤k+r

  • 最后只剩下如何维护www

    单调栈,维护一个递增单调栈和一个递减单调栈。以递减为例

    递减单调栈当一个大于栈顶的元素加入时,会不断弹出栈顶,因此单调栈可以将max(L,R)max(L,R)max(L,R)分成递减的若干段

    单调栈中的一个点其实代表的是一个区间,弹栈顶相当于最大值变化

    被弹出的元素的线段树的最大值变化即是线段树上区间加

code

#include <map>
#include <cstdio>
#include <iostream>
using namespace std;
#define int long long
#define maxn 200005
map < int, int > last;
int n, k, d, pos, flag, ans_l = 1, ans_r = 1;
int a[maxn], Min[maxn], Max[maxn];
int t[maxn << 4], tag[maxn << 4];void build( int num, int l, int r ) {t[num] = l, tag[num] = 0;if( l == r ) return;int mid = ( l + r ) >> 1;build( num << 1, l, mid );build( num << 1 | 1, mid + 1, r );
}void pushdown( int num ) {t[num << 1] += tag[num];tag[num << 1] += tag[num];t[num << 1 | 1] += tag[num];tag[num << 1 | 1] += tag[num];tag[num] = 0;
}void modify( int num, int l, int r, int pos ) {pushdown( num );if( l == r ) {t[num] = 0;return;}int mid = ( l + r ) >> 1;if( pos <= mid ) modify( num << 1, l, mid, pos );else modify( num << 1 | 1, mid + 1, r, pos );t[num] = min( t[num << 1], t[num << 1 | 1] );
}void modify( int num, int l, int r, int L, int R, int w ) {if( R < l || r < L ) return; if( L <= l && r <= R ) {t[num] += w, tag[num] += w;return;}pushdown( num );int mid = ( l + r ) >> 1;modify( num << 1, l, mid, L, R, w );modify( num << 1 | 1, mid + 1, r, L, R, w );t[num] = min( t[num << 1], t[num << 1 | 1] );
}void find( int num, int l, int r, int k ) {if( l == r ) {pos = l, flag = 1;return;}pushdown( num );int mid = ( l + r ) >> 1;if( t[num << 1] <= k ) find( num << 1, l, mid, k );else find( num << 1 | 1, mid + 1, r, k );
}void query( int num, int l, int r, int L, int R, int k ) {if( flag || r < L || R < l ) return;if( L <= l && r <= R ) {if( t[num] <= k ) find( num, l, r, k );return;}pushdown( num );int mid = ( l + r ) >> 1;query( num << 1, l, mid, L, R, k );query( num << 1 | 1, mid + 1, r, L, R, k );
}signed main() {scanf( "%lld %lld %lld", &n, &k, &d );    for( int i = 1;i <= n;i ++ )scanf( "%lld", &a[i] );if( ! d ) {int l = 0, r = 0;for( int i = 1;i <= n;i ++ ) {if( a[i] != a[i - 1] ) l = r = i;else ++ r;if( r - l > ans_r - ans_l ) ans_r = r, ans_l = l;}return ! printf( "%lld %lld\n", ans_l, ans_r );}build( 1, 1, n );int min_top = 0, max_top = 0;for( int r = 1, l = 1;r <= n;r ++ ) {int t = l;if( ( a[r] - a[r - 1] ) % d ) l = r;else l = max( l, last[a[r]] + 1 );last[a[r]] = r;while( t < l ) modify( 1, 1, n, t ++ );//Min:维护min{a[i]|l<=i<=r}的递增栈//Max:维护max{a[i]|l<=i<=r}的递减栈while( min_top && Min[min_top] >= l && a[Min[min_top]] > a[r] ) {modify( 1, 1, n, Min[min_top - 1] + 1, Min[min_top], a[Min[min_top]] / d );min_top --;}//取max是保证单调栈中每个点管辖区间不重复且并集为整个大区间 modify( 1, 1, n, max( l, Min[min_top] + 1 ), r, -a[r] / d );Min[++ min_top] = r;while( max_top && Max[max_top] >= l && a[Max[max_top]] < a[r] ) {modify( 1, 1, n, Max[max_top - 1] + 1, Max[max_top], -a[Max[max_top]] / d );max_top --;}modify( 1, 1, n, max( l, Max[max_top] + 1 ), r, a[r] / d );Max[++ max_top] = r;flag = 0, pos = 0;query( 1, 1, n, l, r, k + r );if( r - pos > ans_r - ans_l ) ans_l = pos, ans_r = r;}printf( "%lld %lld\n", ans_l, ans_r );return 0;
}

CF407 E. k-d-sequence相关推荐

  1. python random库生成伯努利随机数的方法_Python使用random模块生成随机数操作实例详解...

    本文实例讲述了Python使用random模块生成随机数操作.分享给大家供大家参考,具体如下: 今天在用Python编写一个小程序时,要用到随机数,于是就在网上查了一下关于Python生成各种随机数的 ...

  2. Python生成随机数总结

    0.导入包: import random 1.生成0到1的随机浮点数:0<=n<=1.0: a = random.random() 2.生成指定范围的浮点数: n = random.uni ...

  3. 关于C++,Java和Python中的随机数生成法

    首先我们来说说C++中的随机数生成: 我们知道在C++用函数rand()获取的是一个0 ~ RAND_MAX之间的一个随机数.其中RAND_MAX的值为32767. 首先我们来分析两个程序: #inc ...

  4. 牛客网剑指offer编程实践21-30题

    21.栈的压入.弹出序列 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5, ...

  5. 天池 在线编程 数组划分III(计数)

    文章目录 1. 题目 2. 解题 1. 题目 https://tianchi.aliyun.com/oj/231188302809557697/235445278655844965 给你一个整数数组和 ...

  6. [python] ZZ 随机数生成

    ZZ from :http://article.woshao.com/c20b1570247411e09da6000c295b2b8d 感谢原作者: 这些天需要用到从一堆数中随机提取几个数,于是重新研 ...

  7. java遍历字符串_Java后端开发算法基础面试题分享,你离大厂也许就差这份面试题

    一.算法基础 1. 重建二叉树 题目: 输入一棵二叉树前序遍历和中序遍历的结果,请重建该二叉树. 注意: 二叉树中每个节点的值都互不相同: 输入的前序遍历和中序遍历一定合法: 演示: 给定: 前序遍历 ...

  8. 译:Convolutional Two-Stream Network Fusion for Video Action Recognition

              这是双流神经网络的改进版,接下来会出他的读书笔记. 摘要:近年来,卷积神经网络(卷积神经网络)对视频中人类行为识别的应用提出了不同的解决方案,用于整合外观和运动信息.为了更好地利用 ...

  9. 剑指offer题目详细版本

    一.链表题目 1.从尾到头打印链表 使用栈(也可以使用数组,逆序输出) /** * public class ListNode { * int val; * ListNode next = null; ...

  10. The 15th Jilin Provincial Collegiate Programming Contest

    The 15th Jilin Provincial Collegiate Programming Contest A. Random Number Checker 签到 #include <bi ...

最新文章

  1. 关于博客园与CSDN博客同步的说明
  2. jboss7 应用详解_COMSOL Multiphysics多物理场仿真技术与应用光电专题线上培训
  3. PyQt5之QThread线程模块
  4. connect函数介绍
  5. ifix的MySQL数据库_iFIX 技术文章:iFIX历史数据库
  6. Flutter布局锦囊---带输入字段的应用栏
  7. centos7.0上安装五笔输入法
  8. prototype的相关注意点
  9. 项目:艺龙国内机票实时数据爬虫
  10. 解决连接kudu时,delaying RPC due to Service unavailable: Master config (**.**.**.**:7051) has no leader
  11. 网络准入控制 — 保护网络安全
  12. Typora远程解绑设备的方法
  13. wuc-tab标签点击不了_微信公众号新增标签功能,格力被中国移动取消竞标资格,全国电子无偿献血证上线,QQ新增辣椒酱表情,这就是今天的其他大新闻!...
  14. 做不了爱人,我们做什么
  15. windows server 2008 R2无法共享文件夹,无法启用网络发现。
  16. 信息化、数字化与数智化傻傻分不清
  17. 【python数据类型】
  18. 全球通用?电击治疗上不上得了台面
  19. STM32F767/429-CAN通信实验
  20. 为什么下载小电影时,进度经常会卡在99%?

热门文章

  1. 舍不得删的12个优质公号
  2. java foreach 跳过本次循环_【Java】对foreach循环的思考
  3. 期货市场计算机分析指南在线,期货市场计算机分析指南
  4. 女生学高铁和计算机哪个更好,2020铁路最好的5个专业 女生上铁路学什么专业好...
  5. k8s滚动升级_k8s deployment 滚动更新
  6. ab压力测试_Apache ab压力测试的知识点
  7. idea 一直在build_让web开发部署提速 8 倍的一款 IDEA 插件,你有在用?
  8. python 创建目录_第二天:Python中目录及文件操作
  9. leetcode450. 删除二叉搜索树中的节点(详解)
  10. 详解链表在前端的应用,顺便再弄懂原型和原型链!