洛谷$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$
随机推荐
- springboot&mybatis 增删改查系列(一)
创建父项目 首先,我们需要创建一个Maven项目. 在这个项目的pom文件中加入以下几个依赖: <!-- spring boot --> <parent> <groupI ...
- 第二次 C++作业
1.为什么要用函数? 函数是相对独立的,经常使用的功能抽象化表现形式,函数的优势在于,编写之后可以被重复使用,使用时可以只关心函数的功能和使用方法而不必关心函数的具体实现,这样可以有利于代码重用,可以 ...
- Fish Shell使用心得
Fish的官网宣传语是 Finally, a command line shell for the 90s. 翻译过来就是 Fish shell 是一个为90后准备的 shell. 有人说:" ...
- tensorflow入门——5tensorflow安装
你将把你学到的神经网络的知识,借助 TensorFlow ,一个 Google 开源的深度学习框架,应用在真实的数据集中. 你将使用 TensorFlow 来辨别 notMNIST 数据集.它是一个由 ...
- Python 函数参数有冒号 声明后有-> 箭头 返回值注释 参数类型注释
在python3.7 环境下 函数声明时能在参数后加冒号,如图: 1 def f(ham: str, eggs: str = 'eggs') -> str : 2 print("Ann ...
- H3C ISDN网络构成
- Python--day47--内容回顾
1.什么是数据库
- Python--day45--pymysql操作数据库详细
1.一个pymysql往数据库提交数据的简单例子: import pymysql # user = "eric" # pwd = '123123' #增加 conn = pymys ...
- Python--day40--datetime,socketserver,Threading模块分别是哪些模块的高层模块
- 4-4 Selector有一个方法可以获取Selector中的文本内容---extract()
####### 例如: response.xpath('//div[@class ="entry-header"]/h1/text()').extract()