bzoj 2006 [NOI2010]超级钢琴——ST表+堆
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2006
每个右端点的左端点在一个区间内;用堆记录端点位置、可选区间,按价值排序;拿出一个后也许分裂成两个。
第一次写了ST表,写得巨复杂,记录向前/后的最小值和位置,还为了预处理,又记 2^j 走到哪;调了半天边界,最后发现是Lg写错了!至今仍不知那样写为什么会错……
看看别人的代码,原来不用记两个方向的,用的时候往前跳几步再用向后的就行!也不用记录最小值,只要记录位置就行了;也不用记录 to[ ][ ] ,只要从 i+2^j 有没有超过n就能判断边界。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define ll long long
using namespace std;
const int N=5e5+,Lm=;
int n,m,L,R,a[N],s[N],Lg[N],stp[N][Lm+],stn[N][Lm+],to[N][Lm+];
int idp[N][Lm+],idn[N][Lm+];
ll ans;
struct Node{
int ps,to,l,r,v;
Node(int p,int t,int l,int r,int v):ps(p),to(t),l(l),r(r),v(v) {}
bool operator< (const Node &b) const
{return v<b.v;}
};
priority_queue<Node> q;
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='') ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
return fx?ret:-ret;
}
void init()
{
/*
int i=1,cd=0,nxt;
for(;i<=n;i=nxt,cd++)
{
nxt=i<<1;
for(int j=i;j<nxt&&j<=n;j++) Lg[j]=cd;
}
i>>=1;
for(;i<=n;i++) Lg[i]=cd;
*/
for(int i=;i<=n;i++) Lg[i]=Lg[i>>]+; memset(to,0x3f,sizeof to);//
for(int i=;i<n;i++)
{
stp[i][]=s[i]; idp[i][]=i;
to[i][]=i-;
for(int j=,d;j<=Lm;j++)
{
d=to[i][j-];
if(d<||to[d][j-]>n)break;// >n!!! //if d<0
to[i][j]=to[d][j-];
if(stp[d][j-]<stp[i][j-])
{
stp[i][j]=stp[d][j-]; idp[i][j]=idp[d][j-];
}
else
{
stp[i][j]=stp[i][j-]; idp[i][j]=idp[i][j-];
}
}
}
memset(to,0x3f,sizeof to);
for(int i=n-;i>=;i--)
{
stn[i][]=s[i]; idn[i][]=i;
to[i][]=i+;
for(int j=,d;j<=Lm;j++)
{
d=to[i][j-];
if(to[d][j-]>n)break;
to[i][j]=to[d][j-];
if(stn[d][j-]<stn[i][j-])
{
stn[i][j]=stn[d][j-]; idn[i][j]=idn[d][j-];
}
else
{
stn[i][j]=stn[i][j-]; idn[i][j]=idn[i][j-];
}
}
}
}
int main()
{
n=rdn(); m=rdn(); L=rdn(); R=rdn();
for(int i=;i<=n;i++) a[i]=rdn(),s[i]=s[i-]+a[i];
init();
for(int i=,d,t;i<=n;i++)
{
int l=i-R,r=i-L;//not +1
if(r<) continue; l=max(l,);
t=Lg[r-l+];//not +1
d=(stp[r][t]<stn[l][t]?idp[r][t]:idn[l][t]);
q.push(Node(i,d,l,r,s[i]-s[d]));
} while(m--)
{
Node k=q.top(); q.pop(); ans+=k.v;
int l1=k.l,r1=k.to-, l2=k.to+,r2=k.r;
int t,d;
if(l1<=r1)
{
t=Lg[r1-l1+];
d=(stp[r1][t]<stn[l1][t]?idp[r1][t]:idn[l1][t]);
q.push(Node(k.ps,d,l1,r1,s[k.ps]-s[d]));
} if(l2<=r2)
{
t=Lg[r2-l2+];
d=(stp[r2][t]<stn[l2][t]?idp[r2][t]:idn[l2][t]);
q.push(Node(k.ps,d,l2,r2,s[k.ps]-s[d]));
}
}
printf("%lld\n",ans);
return ;
}
bzoj 2006 [NOI2010]超级钢琴——ST表+堆的更多相关文章
- BZOJ 2006: [NOI2010]超级钢琴 ST表+堆
开始想到了一个二分+主席树的 $O(n\log^2 n)$ 的做法. 能过,但是太无脑了. 看了一下题解,有一个 ST 表+堆的优美解法. 你发现肯定是选取前 k 大最优. 然后第一次选的话直接选固定 ...
- BZOJ 2006: [NOI2010]超级钢琴 [ST表+堆 | 主席树]
题意: 一个序列,求k个不相同的长度属于\([L,R]\)的区间使得和最大 前缀和,对于每个r找最小的a[l] 然后我yy了一个可持久化线段树做法...也许会T 实际上主席树就可以了,区间k小值 然后 ...
- [BZOJ2006][NOI2010]超级钢琴(ST表+堆)
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 3679 Solved: 1828[Submit][Statu ...
- 【BZOJ2006】[NOI2010]超级钢琴 ST表+堆
[BZOJ2006][NOI2010]超级钢琴 Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以 ...
- BZOJ 2006 NOI2010 超级钢琴 划分树+堆
题目大意:给定一个序列.找到k个长度在[l,r]之间的序列.使得和最大 暴力O(n^2logn),肯定过不去 看到这题的第一眼我OTZ了一下午... 后来研究了非常久别人的题解才弄明确怎么回事...蒟 ...
- Bzoj 2006: [NOI2010]超级钢琴 堆,ST表
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2222 Solved: 1082[Submit][Statu ...
- BZOJ 2006: [NOI2010]超级钢琴( RMQ + 堆 )
取最大的K个, 用堆和RMQ来加速... ----------------------------------------------------------------- #include<c ...
- 【BZOJ-2006】超级钢琴 ST表 + 堆 (一类经典问题)
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2473 Solved: 1211[Submit][Statu ...
- BZOJ 2006: [NOI2010]超级钢琴
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2613 Solved: 1297[Submit][Statu ...
随机推荐
- Neural Networks for Machine Learning by Geoffrey Hinton (1~2)
机器学习能良好解决的问题 识别模式 识别异常 预測 大脑工作模式 人类有个神经元,每一个包括个权重,带宽要远好于工作站. 神经元的不同类型 Linear (线性)神经元 Binary thresho ...
- com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown database 'user'
1.错误描写叙述 2014-7-12 21:06:05 com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource getPoolManager 信息: ...
- Surrounded Regions 包围区域——dfs
Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A region is captured ...
- SASS入门之SASS安装
当然...凭借我这样的肤浅的智商,根本不能理解什么叫certificate verfiy fail... 所以找了一段时间的方法,最后最终在一个sass群里找到了... 发在这里纯属作为自己的一个学习 ...
- DM8168 unrecoverable error: OMX_ErrorBadParameter (0x80001005) [resolved]
DM8168 custom board 成功启动系统之后想先測一下8168编解码功能,把开发包里的examples跑一遍.启动完毕后.连上HDMI显示,在starting Matrix GUI app ...
- VS2005 调试不能设置断点的解决办法
[ 1] 以前也遇到过同样的问题,但没有问个为什么,也没有探个毕竟.昨天调试一个DLL,添加输出信息吧,太麻烦而且不轻易定位, 但设置断点后按“F5”,断点不可用,气泡提示“当前不会命中断点,还没有为 ...
- Avro schemas are defined with JSON . This facilitates implementation in languages that already have JSON libraries.
https://avro.apache.org/docs/current/ Introduction Apache Avro™ is a data serialization system. Avro ...
- Android笔记之为TextView设置边框
效果图 text_view_background.xml <?xml version="1.0" encoding="utf-8"?> <sh ...
- [P2769] 猴子上树
题目描述 在猴村有一条笔直的山路,这条山路很窄,宽度忽略不计.有 n只猴子正站在山路上静静地观望今天来参加比赛的各位同学.用一个正整数Xi表示第i只猴子所站位置,任意两只猴子的所站位置互不相同.在这条 ...
- Mac 操作系统安装 SVN server教程(Subversion With Mac OS X Tutorial)
Find recent articles on my github page: rubyrobot.github.io © 2006-2014 Imagine Ecommerce Subversion ...