正解:$rmq$/主席树

解题报告:

传送门!

好像看过这题挺多次辣,,,$QwQ$

之前$NOIp$的时候$cjk$学长讲课讲了这题(虽然那时候的$gql$太菜辣并麻油落实这道_(:з」∠)_,然后寒假考试考了这道,然后现在说搞下主席树又碰到这题辣_(:з」∠)_

昂然后先港下题意,,,大概就给定一个序列求前$k$大区间和$QwQ$

分别港下$rmq$和主席树趴$QwQ$

先港$rmq$趴$QwQ$

首先区间求和显然先搞下前缀和,这个显然是要有的$QwQ$

考虑设$f_{i,l,r}$表示左端点在$i$,右端点在$[l,r]$区间内的区间和$max$,区间求最值这个显然就考虑$rmq$就好昂$QwQ$

然后考虑在找到一个最大值之后怎么搞昂$QAQ$?假如当前求出的右端点在$k$,因为要求不能重复,也就相当于右端点不能取$k$了,那原右端点区间就能拆成$[l,k-1]$和$[k+1,r]$

欧克这时候思路就差不多已经清晰辣!就考虑先预处理一个$st$表,然后开一个$set$或者$priority\text{_}queue$之类的东西,然后把(i,l,r)作为状态存进去,每次弹出队首之后就把$(i,l,k-1)$和(i,k+1,r)继续弹进去,然后一直做下去知道有$k$个元素为止

然后就做完辣辣辣辣!

放下$rmq$的代码昂$QwQ$

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define ll long long
#define rg register
#define gc getchar()
#define lowbit(x) (x&(-x))
#define rp(i,x,y) for(rg int i=x;i<=y;++i)
#define my(i,x,y) for(rg ll i=x;i>=y;--i) const ll N=5e5+;
ll n,k,l,r,sum[N],st[N][],id[N][],to[N][],lg[N],poww[]={},as;
struct node{ll l,r,mxpos,id;bool operator <(node gdgs)const{return sum[mxpos]-sum[id-]<sum[gdgs.mxpos]-sum[gdgs.id-];}};
priority_queue<node>Q; il ll read()
{
rg char ch=gc;rg int x=;rg bool y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc; if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il void prelg(){rp(i,,n)lg[i]=lg[i/]+;rp(i,,)poww[i]=poww[i-]<<;}
il void prest()
{
rp(i,,)
rp(j,,n)
{
to[j][i]=to[to[j][i-]+][i-];
if(st[j][i-]>st[to[j][i-]+][i-])st[j][i]=st[j][i-],id[j][i]=id[j][i-];
else st[j][i]=st[to[j][i-]+][i-],id[j][i]=id[to[j][i-]+][i-];
}
}
il ll rmq(ll l,ll r){if(l==r)return l;ll len=lg[r-l+];if(st[l][len]>st[r-poww[len]+][len])return id[l][len];return id[r-poww[len]+][len];} int main()
{
n=read();k=read();l=read();r=read();rp(i,,n)st[i][]=sum[i]=sum[i-]+read(),to[i][]=id[i][]=i;prelg();prest();
rp(i,,n-l+)Q.push((node){i+l-,min(i+r-,n),rmq(i+l-,min(i+r-,n)),i});
while(k--)
{
node gg=Q.top();Q.pop();as+=sum[gg.mxpos]-sum[gg.id-];
if(gg.mxpos->=gg.l)Q.push((node){gg.l,gg.mxpos-,rmq(gg.l,gg.mxpos-),gg.id});;
if(gg.mxpos+<=gg.r)Q.push((node){gg.mxpos+,gg.r,rmq(gg.mxpos+,gg.r),gg.id});
}
printf("%lld\n",as);
return ;
}

然后再港下,主席树的做法$QwQ$

其实依然是考虑用一个$priority\text{_}queue$维护,只是求最值的方法会改变.

考虑用主席树求区间最大值,板子,做完辣

$over$

代码是不可能有代码的,,,$QwQ$

随机推荐

  1. deepin 安装golang protobuf

    1.安装库文件protobuf,地址:https://github.com/protocolbuffers/protobuf/releases 我电脑是deepin 64位的,所以我直接下载https ...

  2. JQuery------库

    JQuery-------------模块.类库 集成了DOM/BOM/JS的类库 一.查找元素 DOM 10左右 JQuery: 选择器: 筛选: ps:版本: 1.x:兼容性最好.1.12推荐 2 ...

  3. SDUT-2132_数据结构实验之栈与队列二:一般算术表达式转换成后缀式

    数据结构实验之栈与队列二:一般算术表达式转换成后缀式 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 对于一个基于二元运 ...

  4. HZOJ visit

    对于前30%的数据,可以考虑dp,f[i][j][k]表示时间为i,在i,j位置的方案数,枚举转移即可.要注意的是可以走到矩阵外. 对于另外30%数据,考虑推一下式子,设向右走y步,左z,上s,下x. ...

  5. vue init定制团队模板使用方法

    每次做项目都要自己搭建项目目录,或者换了公司就的重新搭建项目目录,是不是很麻烦呢?有没有想过一次性把项目目录搭建好,以后直接用呢?你首先想到的可能是复制自己原来的项目,然后删除.修改等等.然而有个更方 ...

  6. 源映射错误:request failed with status 404

    源映射错误:request failed with status 404:源映射错误:request failed with status 404

  7. Getting started with the basics of programming exercises_1

    1.编写一个将输入复制到输出的程序,并将其中连续的多个空格用一个空格代替 使用if 结构: #include<stdio.h> #define NONBLANK 'a'; // repal ...

  8. element表格多选实现单选

    9.element多选表格实现单选 userChoose(selection, row) { console.log(selection,'selection') console.log(row,'r ...

  9. php三目运算计算三个数最大值最小值

    文章地址:https://www.cnblogs.com/sandraryan/ $x = 10; $y = 45; $z = 3; //求出三个数字中最大值最小值 //先比较x y,如果x> ...

  10. H3C PAP验证