洛谷$P$2048 超级钢琴 $[NOI2010]$ $rmq$/主席树
正解:$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$
随机推荐
- 19-3 auth模块
参考:https://www.cnblogs.com/liwenzhou/p/9030211.html 一 auth使用django默认的user表 1 auth常用方法 1. authenticat ...
- Spark JDBC系列--Mysql tinyInt字段特殊处理
当spark取出表的scheme中,类型名为tinyint的字段,会被处理为Boolean型.而mysql中tinyint的sqlType都会默认处理为bit,所以如果数据库中的这类字段中,存储了0. ...
- 从外网站点获取的html去除换行回车制表位\n\r\t
StringStr.Replace("\\r", "").Replace("\\n", "").Replace(&quo ...
- 利用scrapy爬取文件后并基于管道化的持久化存储
我们在pycharm上爬取 首先我们可以在本文件打开命令框或在Terminal下创建 scrapy startproject xiaohuaPro ------------创建文件 scrapy ...
- 强连通分量-----Kosaraju
芝士: 有向图强连通分量在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(strongly connect ...
- Study in JI During the Summer Vacation
15/07/2019-21/07/2019 Task List: 1.uow homework including vocabulary and listening 2.ASL's dictation ...
- 2019-9-2-本文说如何显示SVG
title author date CreateTime categories 本文说如何显示SVG lindexi 2019-09-02 12:57:38 +0800 2018-2-13 17:23 ...
- Vue 中的过滤器的使用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Vue 项目构建完成 ----发布项目
发布项目 cmd 命令行 npm run build 执行打包文件 完成后就会有 3 个文件夹 分别是: 文件夹 :build config dist in ...
- MySQL之Field 'email' doesn't have a default value问题
MySQL在出现这个Field xxx doesn't have a default value错误的原因是:我们设置了该字段为非空,但是我们没有设置默认值照成的. 比如我们创建一个表: CREATE ...