正解:$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. 1月房地产企业销售TOP100出炉 万科重回第一

    1月房地产企业销售TOP100出炉 万科重回第一 2017-02-05 07:40:32 来源:腾讯新闻 责任编辑: [摘要]TOP100房企1月的销售金额合计4311.8亿元,销售面积合计3648. ...

  2. Vue.js 第3章 axios&Vue过渡动画

    promise 它将我们从回调地狱中解脱出来 创建和使用 var fs = require('fs') // 创建promise // reslove表示执行成功后调用的回调函数 // reject表 ...

  3. @noi.ac - 488@ cleaner

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 小Q计划在自己的新家中购置一台圆形的扫地机器人.小Q的家中有一个 ...

  4. rcGIS API for JavaScript之基础篇(一)

    ArcGIS API for JavaScript之基础篇(一)上一篇文章介绍了ArcGIS 10.4的安装指南也包含了所需要资源,需要的同学可以去公众号中查找.最近几天学习了2D地图.3D地图以及图 ...

  5. poj 1514 Metal Cutting (dfs+多边形切割)

    1514 -- Metal Cutting 一道类似于半平面交的题. 题意相当简单,给出一块矩形以及最后被切出来的的多边形各个顶点的位置.每次切割必须从一端切到另一端,问切出多边形最少要切多长的距离. ...

  6. ip2long之后有什么好处?

    ip2long需要bigint来存储,而且在32位和64位系统中存储方式还有区别: 而保存成字符串,只需要char20即可. 那么,ip2long好处在哪? 做投票项目的时候,将ip地址处理后用int ...

  7. jq实现简单购物车增删功能

    https://www.cnblogs.com/sandraryan/ jq实现购物车功能 点击+- 增减数量,计算价格: 点击删除,删除当前行(商品) 点击- ,减到0 询问是否删除商品 点击全选 ...

  8. centos linux ip地址无法连接数据库,ssh登录服务器时必须使用22端口

    问题一:连接数据库时直接使用ip地址无法连接,必须使用ssh方式才能连接? 问题二:ssh登录服务器时必须使用22端口,在/etc/ssh/sshd_config中添加了10086端口,防火墙中已开启 ...

  9. PC端页面如何调用QQ进行在线聊天?

    pc端如何实现QQ在线咨询? html代码如下: <a href="tencent://message/?uin=1234567&Site=Sambow&Menu=ye ...

  10. InetlliJ IDEA的快捷键及各种配置

    在IDEA中新建Maven工程,之后再新建一个Maven模块,此时在模块中的src/main/java中右键新建Java文件时,发现只能新建普通文件,不能新建Java类了,怎么回事,和eclipse的 ...