BZOJ 2006 超级钢琴(划分树+优先队列)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2006
题意: 给出一个数列A,L,R,构造出一个新的集合,集合中的数字为A中任意连续t(L<=t<=R)个数字的和(集合中的数字可以重复)。求集合中前K大的数字和。
思路:首先,我们令S[i]表示A的前i项和,P[i] 表示以A中第i个数字结尾可以取到的最大值,那么显然有:
求出P之后,我们可以用一个堆或者优先队列来维护最大值。那么现在来了另外一个问题,某次在优先队列中取得的是P[i],那么显然要将其从优先队列中删除,此时,以i结尾的次大值也是有可能成为最后答案中一部分的,类似的,我们可能还要求第三大、第四大,也就是求一段区间的第三小、第四小等,我们可以用划分树解决这个问题。现在,整个问题都解决了,首先,求出S,将S建立划分树。然后将所有P插入优先队列。每次从优先队列中取出最大值,删掉,并将这个最大值对应的原数列中位置结尾的下一大的值插入优先队列(这一步也就是在划分树中找到下一小的值),直到取出K个。
int n,m,L,R;
i64 b[N],s[N],S[N];
struct node
{
int L,R;
};
node a[N<<2];
i64 t[35][N];
int tot[35][N];
void init()
{
RD(n,m); RD(L,R);
int i;
for(i=2;i<=n+1;i++) RD(b[i]),S[i]=t[1][i]=s[i]=s[i-1]+b[i];
n++;
sort(s+1,s+n+1);
}
void build(int dep,int u,int L,int R)
{
a[u].L=L;
a[u].R=R;
if(L==R) return;
int mid=(L+R)>>1;
int i,sameNum=mid-L+1;
FOR(i,L,R) if(t[dep][i]<s[mid]) sameNum--;
int LL=L,LR=mid,RL=mid+1,RR=R;
int Lnum=0,Rnum=0;
i64 x;
FOR(i,L,R)
{
if(i==L) tot[dep][i]=0;
else tot[dep][i]=tot[dep][i-1];
x=t[dep][i];
if(x<s[mid])
{
tot[dep][i]++;
t[dep+1][LL+Lnum]=x;
Lnum++;
}
else if(x>s[mid])
{
t[dep+1][RL+Rnum]=x;
Rnum++;
}
else
{
if(sameNum>0)
{
sameNum--;
tot[dep][i]++;
t[dep+1][LL+Lnum]=x;
Lnum++;
}
else
{
t[dep+1][RL+Rnum]=x;
Rnum++;
}
}
}
build(dep+1,u*2,LL,LR);
build(dep+1,u*2+1,RL,RR);
}
i64 query(int dep,int u,int L,int R,int K)
{
if(L==R) return t[dep][L];
int x,y,xx,yy,_L,_R;
int mid=(a[u].L+a[u].R)>>1;
if(L==a[u].L) x=0;
else x=tot[dep][L-1];
y=tot[dep][R]-x;
if(y>=K)
{
_L=a[u].L+x;
_R=a[u].L+x+y-1;
return query(dep+1,u*2,_L,_R,K);
}
else
{
xx=L-a[u].L-x;
yy=R-L+1-y;
_L=mid+1+xx;
_R=mid+1+xx+yy-1;
return query(dep+1,u*2+1,_L,_R,K-y);
}
}
struct Node
{
int pos,k;
i64 x;
Node(){}
Node(int _pos,int _k,i64 _x)
{
pos=_pos;
k=_k;
x=_x;
}
int operator<(const Node &a) const
{
return x<a.x;
}
};
priority_queue<Node> Q;
int main()
{
init(); build(1,1,1,n);
int i,x,y;
for(i=L+1;i<=n;i++)
{
x=max(1,i-R);
y=i-L;
Q.push(Node(i,1,S[i]-query(1,1,x,y,1)));
}
i64 ans=0;
Node p;
while(m--)
{
p=Q.top(); Q.pop();
ans+=p.x;
x=max(1,p.pos-R);
y=p.pos-L;
if(p.k+1>y-x+1) continue;
Q.push(Node(p.pos,p.k+1,S[p.pos]-query(1,1,x,y,p.k+1)));
}
PR(ans);
}
BZOJ 2006 超级钢琴(划分树+优先队列)的更多相关文章
- BZOJ 2006 NOI2010 超级钢琴 划分树+堆
题目大意:给定一个序列.找到k个长度在[l,r]之间的序列.使得和最大 暴力O(n^2logn),肯定过不去 看到这题的第一眼我OTZ了一下午... 后来研究了非常久别人的题解才弄明确怎么回事...蒟 ...
- bzoj2006 noi2010 超级钢琴 主席树 + 优先队列
Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2435 Solved: 1195 Description 小 Z是一个小有名气的钢琴家,最近C博士送 ...
- BZOJ 2006 超级钢琴(堆+主席树)
很好的一道题. 题意:给出长度为n的数列,选择k个互不相同的区间,满足每个区间长度在[L,R]内,求所有选择的区间和的总和最大是多少.(n,k<=5e5). 首先将区间和转化为前缀和之差,那么我 ...
- [BZOJ 2006] 超级钢琴
Link: https://www.lydsy.com/JudgeOnline/problem.php?id=2006 Algorithm: 对于此类区间最值类问题,我们可以通过控制一端不变来寻找当前 ...
- bzoj 2006 超级钢琴 —— ST表
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2006 本来应该是可以用主席树,找区间最小值,取出来后再找那段区间的次小值...... 但也可 ...
- 【BZOJ 2006】2006: [NOI2010]超级钢琴(RMQ+优先队列)
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2792 Solved: 1388 Description 小 ...
- [BZOJ2006] [NOI2010]超级钢琴 主席树+贪心+优先队列
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 3591 Solved: 1780[Submit][Statu ...
- [NOI2010]超级钢琴 主席树
[NOI2010]超级钢琴 链接 luogu 思路 和12省联考的异或粽子一样. 堆维护n个左端点,每次取出来再放回去次 代码 #include <bits/stdc++.h> #defi ...
- [NOI2010][bzoj2006] 超级钢琴 [主席树/ST表+堆]
题面: 传送门 思路: 首先容易想到用堆维护的O(n2logn)暴力 那么肯定就是在这个基础上套数据结构了[愉快] 然而我因为过于蒟蒻......只想得到主席树暴力***过去的方法 大概就是把前缀和算 ...
随机推荐
- 【LCA】CodeForce #326 Div.2 E:Duff in the Army
C. Duff in the Army Recently Duff has been a soldier in the army. Malek is her commander. Their coun ...
- tomcat错误:@HandlesTypes annotation of one or more ServletContentInitializers
项目在别人的机器上运行正常,但是在自己机器上运行出现该错误,所以判断应该是环境配置的问题,通过更换eclipse.更换jdk.更换maven.更换tomcat的不同版本,最终确认是tomcat的问题. ...
- Codeforces Round #204 (Div. 2)->C. Jeff and Rounding
C. Jeff and Rounding time limit per test 1 second memory limit per test 256 megabytes input standard ...
- html之cellspacing && cellpadding讲解
单元格间距(表格间距)(cellspacing) -- 代表表格边框与单元格补白的距离,也是单元格补白之间的距离 单元格边距(表格填充)(cellpadding) -- 代表单元格外面的一个距离,用于 ...
- Linux 配置网络
1.vi /etc/sysconfig/network-scripts/ifcfg-eth0 2. # Advanced Micro Devices [AMD] 79c970 [PCnet32 LA ...
- jQuery实现 浏览器后退到上次浏览位置
近日看腾讯.新浪的移动端网站,发现一件非常蛋疼的事情,在列表浏览内容,我往下翻,往下翻,突然,看到一个十分霸气的标题,于是点到文章查看详细内容,若干时间后,点回退按钮,浏览器回退到页面的最顶部了. 于 ...
- IE6 IE7 IE8(Q) 不支持 JSON 对象
标准参考 JSON 是一种数据交换格式,RFC 4627 对 JSON 进行了详细描述. 根据 ECMA-262(ECMAScript)第 5 版中描述,JSON 是一个包含了函数 parse 和 s ...
- linux 上传/下载文件到windows工具
一般来说,linux服务器大多是通过ssh客户端来进行远程的登陆和管理的,使用ssh登陆linux主机以后,如何能够快速的和本地机器进行文件的交互呢,也就是上传和下载文件到服务器和本地: 与ssh ...
- 机器学习在 IT 运维管理中的必要性!
机器学习技术在监控工具中的应用已经成为 IT 运维与 DevOps 团队的一大热点话题.尽管相关的使用案例很多,对 IT 团队而已真正的「杀手级应用」是机器学习如何提高实时事件管理能力,从而帮助较大规 ...
- POJ 2480 Longge's problem (积性函数,欧拉函数)
题意:求∑gcd(i,n),1<=i<=n思路:f(n)=∑gcd(i,n),1<=i<=n可以知道,其实f(n)=sum(p*φ(n/p)),其中p是n的因子.为什么呢?原因 ...