CF407 E. k-d-sequence(线段树+单调栈)

文章目录

  • CF407 E. k-d-sequence
    • problem
    • solution
    • code

CF407 E. k-d-sequence

problem

solution

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

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

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

    • 先将序列分成若干个同余mmm的子区间,从左往右扫一遍,即可得到

    • 对于同余的子区间,把所有数进行x−rd\frac{x-r}{d}dxr的操作,转化为求公差为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{xilir}min{xilir}+1(rl+1)

      满足增加个数≤k\le kk

    • 从小到大顺次枚举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{xilir}min{xilir}+1(rl+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{xilir}min{xilir}+lk+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{xilir}min{xilir}+l

        lll的下界为pospospos,则要在[pos,r][pos,r][pos,r]找最左边的lll,满足wl≤k+rw_l\le k+rwlk+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 );//取max维护不重复的条件last[a[r]] = r;while( t < l ) modify( 1, 1, n, t ++ );//清除不属于[l,r]区间的所有线段树痕迹//Min:维护min{a[i]|l<=i<=r}的递增栈//Max:维护max{a[i]|l<=i<=r}的递减栈//栈内点管辖一个区间eg:s[top]管辖(s[top-1],s[top]] //w[l]=max[L,R]-min[L,R]+lwhile( 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 );//[L,R]中最小值变小 先把之前-min(L,R)的贡献抵消掉 所以是+min_top --;}//把现在真正的min(L,R)贡献放进去 所以是- 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 --;}//取左端点max比较是保证单调栈中每个点管辖区间不重复且并集为整个大区间 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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317420.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

D. Binary Literature

D. Binary Literature 题意&#xff1a; 给三个长度为2 * n的01串&#xff0c;让你构造一个长度小于3 * n的字符串&#xff0c;使得这个串至少包含两个01串 题解&#xff1a; 很巧妙的构造题 三个指针分别指向三个串&#xff0c;因为是01串&#xff0c;所以一定存在两个字符…

安逸:鼠绘《诗与远方》

【作品名称】《诗与远方》【作者介绍】徐安&#xff08;笔名安逸&#xff0c;常州&#xff09;&#xff0c;PPT专家&#xff0c;鼠绘专家。平面设计专业&#xff0c;6年PPT设计经验&#xff1b;历届江苏省PPT制作大赛一等奖获得者&#xff0c;PA口袋动画重要合作人。PPT动画制作…

洛谷P4292:重建计划(点分治、单调队列)

解析 第一眼&#xff1a;Wow这么水的黑&#xff1f;&#xff1f; 然后写了一发二分套线段树的3log代码上去 T到飞起&#xff0c;只有40… 无奈瞅了一眼标签&#xff1a;单调队列 对啊 于是又写了一个上去 20 … 好啊 然后就摆烂了 qwq 果然黑题没有一个好东西 一个关键的思…

E. Colorings and Dominoes(未解决)

E. Colorings and Dominoes 题意&#xff1a; n * m的格子&#xff0c;分为黑白格子&#xff0c;白格子可以染成蓝色或者红色&#xff0c;一个1 * 2的多米诺骨牌&#xff0c;可以覆盖两个连续的水平的红色格子或者两个连续的竖着的蓝色格子&#xff0c;对于一个染色方案&…

[HNOI2016]网络(树链剖分+线段树+大根堆)

[HNOI2016]网络 problem solution 另辟蹊径&#xff0c;不把交互请求赋在新增路径上&#xff0c;反而把交互请求赋在树上除去该请求路径覆盖点的其它点上 显然&#xff0c;路径问题树剖是非常可以的、 那么一个点上的信息就表示所有不经过该点的交互请求&#xff0c;用堆…

P4557-[JSOI2018]战争【凸包,闵可夫斯基和】

正题 题目连接:https://www.luogu.com.cn/problem/P4557 题目大意 给出两个点集A,BA,BA,B&#xff0c;qqq次询问给出一个向量vvv&#xff0c;询问将BBB中所有点加上向量vvv后两个集合的凸包是否有交。 1≤n,m,q≤1051\leq n,m,q\leq 10^51≤n,m,q≤105 解题思路 闵可夫斯基和…

IdentityServer4实战 - JWT Token Issuer 详解

一.前言本文为系列补坑之作&#xff0c;拖了许久决定先把坑填完。下文演示所用代码采用的 IdentityServer4 版本为 2.3.0&#xff0c;由于时间推移可能以后的版本会有一些改动&#xff0c;请参考查看&#xff0c;文末附上Demo代码。本文所诉Token如无特殊说明皆为 JWT Token。众…

P3834 【模板】可持久化线段树 2(整体二分做法)

P3834 【模板】可持久化线段树 2&#xff08;主席树&#xff09; 我们详细讲讲这个整体二分如何求区间第k小 我们都知道二分可以求出区间里某个想要的值&#xff0c;如果有很多询问&#xff0c;我们对每个询问都进行二分&#xff0c;复杂度就是O(QNlog(1e9))铁超&#xff0c;那…

YBTOJ洛谷P3292:幸运数字(线性基、点分治/倍增)

解析 虽然使用三个log的倍增算法艹过去了 但是我们还是来聊聊正解吧 考虑点分治 对于当前的根&#xff0c;dfs求出联通块内每个点到当前根的线性基 一条路径的答案应该在路径出现上第一个成为根的点时统计到 具体来说&#xff0c;就是路径的两端点在同一个solve函数的不同子树…

AGC053E-More Peaks More Fun【计数】

正题 题目链接:https://atcoder.jp/contests/agc053/tasks/agc053_e 题目大意 给出nnn个二元组(ai,bi)(a_i,b_i)(ai​,bi​)&#xff0c;求有多少个1∼n1\sim n1∼n的排列ppp满足&#xff1a; 你可以将一些(ai,bi)(a_i,b_i)(ai​,bi​)变为(bi,ai)(b_i,a_i)(bi​,ai​)定义序…

「JOISC 2020 Day4」治疗计划(线段树+dijkstra最短路)

「JOISC 2020 Day4」治疗计划 description solution 设dpi:1−Ridp_i:1-R_idpi​:1−Ri​ 都能被救治成功的最小花费 两个治疗方案[Li,Ri],[Lj,Rj][L_i,R_i],[L_j,R_j][Li​,Ri​],[Lj​,Rj​]能够合并成完整的健康区间的条件为Ri−Lj1≥∣Ti−Tj∣R_i-Lj1\ge |T_i-T_j|Ri​…

胡浩:人人能学的AI《从零开始机器学习》苏州.NET俱乐部课程分享

【课程名称】《从零开始机器学XI》【老师介绍】胡浩&#xff0c;微软最有价值专家&#xff08;MVP&#xff0c;十余届多方向&#xff09;&#xff0c;微软技术大会讲师。云、数据中心基础架构、全栈虚拟化、企业移动管理等领域的架构师及顾问。AI/ML等新技术的爱好者&#xff0…

整体二分例题

参考oi wiki 引入&#xff1a; 有一部分题可以使用二分的办法来解决。但是当这种题目有多次询问且每次询问我们对每个查询都直接二分&#xff0c;可能会收获一个 TLE。这时候我们就会用到整体二分。整体二分的主体思路就是把多个查询一起解决。&#xff08;所以这是一个离线算…

P8338-[AHOI2022]排列【质因数分解】

正题 题目链接:https://www.luogu.com.cn/problem/P8338 题目大意 给出一个排列pip_ipi​&#xff0c;定义ai0i,aikapik−1a_i^0i,a_i^ka_{p_i}^{k-1}ai0​i,aik​api​k−1​。 对于排列PPP&#xff0c;定义F(P)F(P)F(P)表示最小的一个正整数kkk满足Pk1PP^{k1}PPk1P。 定义…

CF1100F Ivan and Burgers(线性基)

解析 做幸运数字的时候逛题解区爬过来的 挺妙的 把所有询问离线下来&#xff0c;按右端点排序 贪心的让最高位更高的向量出现的尽可能向右 实现上可以把线性基里的向量和当前的数swap来实现 代码就非常好写了 代码 #include<bits/stdc.h> using namespace std; #defi…

[APIO2013]机器人(DP+SPFA最短路)

[APIO2013]机器人 description solution dpl,r,i,j:dp_{l,r,i,j}:dpl,r,i,j​: 在(i,j)(i,j)(i,j)位置合并编号为[l,r][l,r][l,r]区间内的所有机器人的最小花费 toi,j,k:to_{i,j,k}:toi,j,k​: 从(i,j)(i,j)(i,j)以kkk方向推机器人最终停止的位置&#xff0c;用dfs记忆化搜索…

IdentityServer4实战 - 与API单项目整合

一.前言我们在实际使用 IdentityServer4 的时候&#xff0c;可能会在使用 IdentityServer4 项目添加一些API&#xff0c;比如 找回密码、用户注册、修改用户资料等&#xff0c;这些API与IdentityServer4怎么共存在一个项目呢&#xff1f;二.整合1.首先在 Startup.cs 中添加 Ide…

P2305 [NOI2014] 购票(点分治、斜率优化)

解析 第一道完全自己做出来的黑题awa &#xff08;如果不算那道感觉完全是恶评的石油的话&#xff09; 然而连写带调整了3.5h… 容易想到链的做法 设ancxanc_xancx​表示x的祖先,disxdis_xdisx​表示x到1的距离 则有&#xff1a; dpvmin⁡disv−lv<disu,u∈ancv(dpupv(dis…

HDU1394(权值线段树)

HDU1394(权值线段树) 题意&#xff1a; 给定一个0到n-1的数字组成的序列&#xff0c;可以将序列进行左移任意次&#xff0c;求所能组成序列的逆序对的最小值 题解&#xff1a; 利用权值线段树&#xff0c;我们先求出当前序列所能组成的逆序对&#xff0c; 然后依次左移动 当…

P8339-[AHOI2022]钥匙【虚树,扫描线】

正题 题目连接:https://www.luogu.com.cn/problem/P8339 题目大意 给出nnn个点的一棵树&#xff0c;每个点有钥匙或者宝箱&#xff0c;有不同的颜色。 mmm次询问&#xff0c;从xxx走到yyy&#xff0c;走到钥匙时会拾取钥匙&#xff0c;走到宝箱时如果有同色的钥匙那么就会消耗…