BZOJ4504. K个串(主席树+优先队列)

4504. K个串

  • description
  • solution
  • code

description

兔子们在玩k个串的游戏。首先,它们拿出了一个长度为n的数字序列,选出其中的一

个连续子串,然后统计其子串中所有数字之和(注意这里重复出现的数字只被统计一次)。

兔子们想知道,在这个数字序列所有连续的子串中,按照以上方式统计其所有数字之和,第

k大的和是多少。

Input

第一行,两个整数n和k,分别表示长度为n的数字序列和想要统计的第k大的和

接下里一行n个数a_i,表示这个数字序列

Output

一行一个整数,表示第k大的和

Sample Input

7 5
3 -2 1 2 2 1 3 -2

Sample Output

4

Hint

1 <= n <= 100000, 1 <= k <= 200000, 0 <= |a_i| <= 10^9数据保证存在第 k 大的和

solution

一个[l,r][l,r][l,r]的子串的和定义为不同数的和,一个数多次出现只算一次

可以联想到Rmq Problem / mex的处理

以每个iii为子串右端点rrr建立一个新版本的主席树

每个版本的叶子结点的值就是该点做左端点时,这个子串的和

先继承上一个i−1i-1i1版本

再记录上一次该值的出现位置lstilst_ilsti,那么aia_iai只会对(lsti,i](lst_i,i](lsti,i]内的数产生aia_iai贡献

唯一不同的是,这里的修改是对一段区间的修改,为了线段树的复杂度正确必须使用懒标记

而主席树的懒标记,因为某些节点的共用,后面版本的懒标记下传可能会影响前面版本的答案

所以,每个新版本的懒标记下放的时候都需要复制原点,在新点上操作

问题不是求最大,而是第KKK

这又联想到[NOI]超级钢琴从最佳点进行左右区间切割的处理

先往有先队列里面丢每个版本最大值ans,以及最大值选取的左端点位置pos,还要记录是哪个版本线段树i,以及可选取为左端点的区间l,r

当取出当前的最大值(ans,i,l,r,pos)

就会分裂成两个区间(*,i,l,pos-1,*) (*,i,pos+1,r,*)

*需要对该版本的线段树进行查询,查询区间内的最大值及最大值位置

code

调懒标记的问题,调麻了

#include <map>
#include <queue>
#include <cstdio>
#include <iostream>
using namespace std;
#define Pair pair < int, int >
#define int long long
#define maxn 100005
map < int, int > mp;
struct Node { int ans, i, l, r, pos;bool operator < ( const Node &t ) const {return ans < t.ans;}
};
priority_queue < Node > q;
struct node { int lson, rson, Max, tag, pos; }t[maxn * 160];
int n, k, cnt;
int lst[maxn], a[maxn], root[maxn];void pushup( int now ) {if( t[t[now].lson].Max > t[t[now].rson].Max ) t[now].Max = t[t[now].lson].Max, t[now].pos = t[t[now].lson].pos;elset[now].Max = t[t[now].rson].Max, t[now].pos = t[t[now].rson].pos;
}void pushdown( int now ) {if( ! t[now].tag ) return;node lson = t[t[now].lson];node rson = t[t[now].rson];t[t[now].lson = ++ cnt] = lson;t[t[now].rson = ++ cnt] = rson; t[t[now].lson].Max += t[now].tag;t[t[now].lson].tag += t[now].tag;t[t[now].rson].Max += t[now].tag;t[t[now].rson].tag += t[now].tag;t[now].tag = 0;
}void build( int &now, int l, int r ) {now = ++ cnt;if( l == r ) { t[now].Max = 0, t[now].pos = l; return; }int mid = ( l + r ) >> 1;build( t[now].lson, l, mid );build( t[now].rson, mid + 1, r );pushup( now );
}void modify( int &now, int lst, int l, int r, int L, int R, int val ) {if( r < L or R < l ) return;if( L <= l and r <= R ) {t[now = ++ cnt] = t[lst];t[now].Max += val;t[now].tag += val;return;}pushdown( lst );t[now = ++ cnt] = t[lst];int mid = ( l + r ) >> 1;modify( t[now].lson, t[lst].lson, l, mid, L, R, val );modify( t[now].rson, t[lst].rson, mid + 1, r, L, R, val );pushup( now );
}Pair query( int now, int l, int r, int L, int R ) {if( r < L or R < l ) return make_pair( -1e18, 0 );if( L <= l and r <= R ) return make_pair( t[now].Max, t[now].pos );pushdown( now );int mid = ( l + r ) >> 1;Pair lson = query( t[now].lson, l, mid, L, R );Pair rson = query( t[now].rson, mid + 1, r, L, R );return max( lson, rson );
}signed main() {scanf( "%lld %lld", &n, &k );for( int i = 1;i <= n;i ++ ) {scanf( "%lld", &a[i] );if( mp[a[i]] ) lst[i] = mp[a[i]];mp[a[i]] = i;}build( root[0], 1, n );for( int i = 1;i <= n;i ++ ) {modify( root[i], root[i - 1], 1, n, lst[i] + 1, i, a[i] );Pair it = query( root[i], 1, n, 1, i );q.push( { it.first, i, 1, i, it.second } );}int ans, pos, l, r, i; Pair it;while( k -- ) {Node now = q.top(); q.pop();ans = now.ans, pos = now.pos, i = now.i, l = now.l, r = now.r;if( pos ^ l ) {it = query( root[i], 1, n, l, pos - 1 );q.push( { it.first, i, l, pos - 1, it.second } );}if( pos ^ r ) {it = query( root[i], 1, n, pos + 1, r );q.push( { it.first, i, pos + 1, r, it.second } );}}printf( "%lld\n", ans );return 0;
}

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

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

相关文章

【招聘(北京)】北森测评招聘 .NET 架构师、高级工程师

工作职责公司核心产品的迭代需求分析设计开发。公司核心产品的线上维护和性能调优。对初中级技术人员培养和质量把关。编写软件设计和技术文档。任职资格为人正直、诚信、责任心强&#xff0c;能承受较大工作压力。强烈的目标导向意识&#xff0c;逻辑思维清晰&#xff0c;执行…

网络流模型与技巧总结

文章目录前言常见基本模型最大匹配、最小点覆盖和最大独立集构造最小点覆盖最大点权匹配最小路径覆盖不可重覆盖可重覆盖最大权闭合子图建图技巧利用拆点进行限流利用断边表示决策利用虚点表示组合关系链状模型用链表示时间轴用链表示偏序关系形式的选取限制通过拆点描述先后顺…

卢卡斯定理 Lucas

参考文章 详细定义内容看这个参考文章 结论&#xff1a; 模板&#xff1a; Lucas函数&#xff1a; long long Lucas(long long n,long long m){if(m0) return 1;return Lucas(n/p,m/p)*C(n%p,m%p)%p; }组合数函数&#xff1a; 此处求逆元的用的bp-2 long long C(long long…

BZOJ #2874. 训练士兵(差分+离散化+主席树)

BZOJ #2874. 训练士兵descriptionsolutioncodedescription Ryz正在着手于训练一批精锐士兵 Ryz手下有n*m个士兵&#xff0c;排成一个n行m列的方阵。在一天中&#xff0c;ryz会对士兵下达一些命令&#xff0c;每个命令作用于一个小方阵的所有士兵&#xff0c;并且会增加他们的…

VS 2019 要来了,是时候了解一下 C# 8.0 新功能

近日&#xff0c;微软发布了 Visual Studio 2019 的发布日期&#xff0c;2019 年 4 月 2 日 Visual Studio 2019 将正式和大家见面&#xff0c;同时微软还将提供发布现场实时直播。除了 Visual Studio 2019 自身之外&#xff0c;VS 2019 的发布还牵动着很多 C# 开发者的心。虽然…

[蓝桥杯2020国赛]游园安排

题目&#xff1a; 题解&#xff1a; 本质就是求最长上升子序列&#xff0c;只不过这里是字符串版本的&#xff0c;我们都知道有n^2的LIS&#xff0c;但其实还有O(nlogn)版本的&#xff0c;详细看这里&#xff0c;套上就行 另外我发现这里竟然有蓝桥杯全套的编程题离谱&#xf…

洛谷P2761:软件补丁问题(状压、分层图最短路)

当遇到瓶颈时&#xff0c;想想自己是否做了可以优化的无用功。 解析 不难想到状压最短路的做法。 但是直接加边的话边数会是 O(m2n)O(m2^n)O(m2n) 级别&#xff0c;只有 909090 分&#xff0c;难以通过。 注意到&#xff0c;由于补丁很少&#xff0c;真正能达到的状态是很有限…

[2020-09-11 CQBZ/HSZX多校联测 T3] 万猪拱塔(线段树+巧妙转化)

万猪拱塔descriptionsolutioncodedescription 题目描述 小七养了很多头猪&#xff0c;它们分布在 n 行 m 列中&#xff0c;其中第 i 行第 j 列的猪圈养的是第 wi,jw_{i,j}wi,j​ 种猪。 小七有时会选择一个子矩形范围内的猪圈进行巡视&#xff0c;如果该子矩形包含 i 行 j 列 …

重新解读DDD领域驱动设计(一)

回顾十年前&#xff0c;还未踏入某校时&#xff0c;便听闻某学长一毕业就入职北京某公司&#xff0c;月薪过万。对于一个名不见经传的小学院&#xff0c;一毕业能拿到这个薪水还是非常厉害的。听闻他学生期间参与开发了一款股票软件&#xff0c;股票那时正迎来一波疯涨。时也运…

Tickets HDU - 1260

Tickets HDU - 1260 题意&#xff1a; 著名的宫崎骏动画片《千与千寻》在中传1500报重映&#xff0c;中传学子有幸成为全国第一批观众。动画学院学生会负责给大家发票&#xff0c;所有的中传同学只要把中传首映《千与千寻》的推送信息发到朋友圈并集够10个赞&#xff0c;就可…

洛谷P3357:最长k可重线段集问题(网络流)

解析 本题的建模方法有很多&#xff0c;我的做法是补集思想转化成志愿者招募然后按照那道题的做法直接做&#xff0c;看题解更多是采用的对于不冲突的线段首尾加边的做法。 在前一道最长k可重区间问题中这两种做法谈不上孰优孰劣&#xff0c;但本题中题解的做法在处理垂直线段…

程序员修神之路--高并发优雅的做限流(有福利)

点击上方蓝色字体&#xff0c;关注我们菜菜哥&#xff0c;有时间吗&#xff1f;YY妹&#xff0c;什么事&#xff1f;我最近的任务是做个小的秒杀活动&#xff0c;我怕把后端接口压垮&#xff0c;X总说这可关系到公司的存亡简单呀&#xff0c;你就做个限流呗这个没做过呀&#x…

BZOj #4771. 七彩树(主席树+dfn序+lca)

BZOj #4771. 七彩树descriptionsolutioncodedescription 给定一棵n个点的有根树&#xff0c;编号依次为1到n&#xff0c;其中1号点是根节点。每个节点都被染上了某一种颜色&#xff0c;其中第i个节点的颜色为c[i]。如果c[i]c[j]&#xff0c;那么我们认为点i和点j拥有相同的颜色…

免费馅饼 HDU - 1176

免费馅饼 HDU - 1176 题意&#xff1a; 都说天上不会掉馅饼&#xff0c;但有一天gameboy正走在回家的小径上&#xff0c;忽然天上掉下大把大把的馅饼。说来gameboy的人品实在是太好了&#xff0c;这馅饼别处都不掉&#xff0c;就掉落在他身旁的10米范围内。馅饼如果掉在了地上…

CF1631F:Flipping Range(dp)

解析 设 x,y∈B,x<yx,y\in B,x<yx,y∈B,x<y&#xff0c;那么也有 x−y∈Bx-y\in Bx−y∈B。 递归下去&#xff0c;根据辗转相减求 gcd⁡\gcdgcd 的方法可知&#xff0c;最终会得到 gcd⁡(x,y)\gcd(x,y)gcd(x,y)。 那么对于整个集合 BBB &#xff0c;它也就等价于所有…

微软 HoloLens 2 正式登场!让你看看什么叫真正的黑科技

北京时间 2 月 25 日凌晨消息&#xff0c;微软在 MWC19 举行新品发布会&#xff0c;正式发布了万众期待的 HoloLens 2 等产品。▲ 认识全新的 Microsoft HoloLens 2微软 HoloLens 全息眼镜是微软推出的一款头戴式混合现实装置&#xff0c;可以完全独立使用&#xff0c;无需线缆…

Piggy-Bank HDU - 1114

Piggy-Bank HDU - 1114 题意&#xff1a; 小猪储钱罐存在一个大的问题&#xff0c;即无法确定其中有多少钱。因此&#xff0c;我们可能在打碎小猪储钱罐之后&#xff0c;发现里面的钱不够。显然&#xff0c;我们希望避免这种不愉快的情况。唯一的可能是&#xff0c;称一下小猪…

BZOJ #3166. [Heoi2013]Alo(可持久化trie树+set)

#3166. [Heoi2013]AlodescriptionsolutioncodeBZOJ3166 description Welcome to ALO ( Arithmetic and Logistic Online)。这是一个VR MMORPG &#xff0c; 如名字所见&#xff0c;到处充满了数学的谜题。 现在你拥有n颗宝石&#xff0c;每颗宝石有一个能量密度&#xff0c;记…

洛谷P6054:开门大吉

Description\text{Description}Description P6054 开门大吉 nnn 位选手去参加节目“开门大吉”。共有 mmm 套题&#xff0c;每套题包含 ppp 个题目&#xff0c;第 iii 位选手答对第 jjj 套题中第 kkk 道的概率为 fi,j,kf_{i,j,k}fi,j,k​。 若一位选手答对第 iii 题&#xff0…

Docker最全教程之Ubuntu下安装Docker(十五)

前言Ubuntu是一个以桌面应用为主的开源GNU/Linux操作系统&#xff0c;应用很广。本篇主要讲述Ubuntu下使用SSH远程登录并安装Docker&#xff0c;并且提供了Docker安装的两种方式&#xff0c;希望对大家有所帮助。拥抱Linux&#xff0c;大家可以从Ubuntu开始&#xff01;Ubuntu下…