【BZOJ2006】【NOI2010】超级钢琴(主席树,优先队列)
【BZOJ2006】超级钢琴(主席树,优先队列)
题面
题解
既然是一段区间
首先就要变成单点
所以求一个前缀和
这个时候贪心很明显了:
枚举每一个点和可以和它组成一段的可行的点
全部丢进一个堆里面
取出最大的\(K\)个就行了
但是,很显然,我们做不到都取出来
所以,考虑怎么优化这个过程
每次堆里面对于每个点就先维护一个最大贡献
显然的,只有取出了最大贡献,才会取出次大贡献
那么,最大/次大/\(K\)大贡献怎么算?
一个点,能够和他组成和弦的是一个连续的区间
最大的贡献就是它和区间最小值的差
依次类推
就是区间第\(K\)大
所以搞一棵主席树
维护一下区间第\(K\)大就好啦
再用堆每次取出/加入即可
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define MAX 510000
inline int read()
{
int x=0,t=1;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
struct Data{int v,id,k;};
bool operator<(Data a,Data b){return a.v<b.v;}
priority_queue<Data> Q;
struct Node
{
int ls,rs;
int sum;
}t[MAX<<6];
int tot,S[MAX],top,rt[MAX],L,R,n,K;
int a[MAX];
void Modify(int &now,int ff,int l,int r,int pos,int w)
{
t[now=++tot]=t[ff];t[now].sum+=w;
if(l==r)return;
int mid=(l+r)>>1;
if(pos<=mid)Modify(t[now].ls,t[ff].ls,l,mid,pos,w);
else Modify(t[now].rs,t[ff].rs,mid+1,r,pos,w);
}
int Query(int A,int B,int l,int r,int K)
{
if(l==r)return l;
int mid=(l+r)>>1;
int sum=t[t[A].ls].sum-t[t[B].ls].sum;
if(sum<K)return Query(t[A].rs,t[B].rs,mid+1,r,K-sum);
else return Query(t[A].ls,t[B].ls,l,mid,K);
}
int main()
{
n=read()+1;K=read();L=read();R=read();
for(int i=2;i<=n;++i)S[++top]=a[i]=a[i-1]+read();S[++top]=0;
sort(&S[1],&S[top+1]);
top=unique(&S[1],&S[top+1])-S-1;
for(int i=1;i<=n;++i)a[i]=lower_bound(&S[1],&S[top+1],a[i])-S;
for(int i=1;i<=n;++i)Modify(rt[i],rt[i-1],1,top,a[i],1);
for(int i=L+1;i<=n;++i)
{
Data x;x.id=i;x.k=1;
x.v=S[a[i]]-S[Query(rt[i-L],rt[max(0,i-R-1)],1,top,1)];
Q.push(x);
}
long long ans=0;
while(K--)
{
Data x=Q.top();Q.pop();
ans+=x.v;
if(x.k==min(x.id-L,R-L+1))continue;
x.k++;
x.v=S[a[x.id]]-S[Query(rt[x.id-L],rt[max(0,x.id-R-1)],1,top,x.k)];
Q.push(x);
}
printf("%lld\n",ans);
return 0;
}
【BZOJ2006】【NOI2010】超级钢琴(主席树,优先队列)的更多相关文章
- bzoj2006 noi2010 超级钢琴 主席树 + 优先队列
Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2435 Solved: 1195 Description 小 Z是一个小有名气的钢琴家,最近C博士送 ...
- [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 ...
- bzoj2006 [NOI2010]超级钢琴 (及其拓展)
bzoj2006 [NOI2010]超级钢琴 给定一个序列,求长度在 \([L,\ R]\) 之间的区间和的前 \(k\) 大之和 \(n\leq5\times10^5,\ k\leq2\times1 ...
- BZOJ2006 [NOI2010]超级钢琴 【堆 + RMQ】
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MB Submit: 3446 Solved: 1692 [Submit][Sta ...
- bzoj千题计划162:bzoj2006: [NOI2010]超级钢琴
http://www.lydsy.com/JudgeOnline/problem.php?id=2006 输出最大的k个 sum[r]-sum[l-1] (L<=r-l+1<=R) 之和 ...
- 【BZOJ 2006】2006: [NOI2010]超级钢琴(RMQ+优先队列)
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2792 Solved: 1388 Description 小 ...
- [BZOJ2006][NOI2010]超级钢琴(ST表+堆)
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 3679 Solved: 1828[Submit][Statu ...
- BZOJ2006[NOI2010]超级钢琴——堆+主席树
题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的 音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为Ai,其中 ...
- [NOI2010][bzoj2006] 超级钢琴 [主席树/ST表+堆]
题面: 传送门 思路: 首先容易想到用堆维护的O(n2logn)暴力 那么肯定就是在这个基础上套数据结构了[愉快] 然而我因为过于蒟蒻......只想得到主席树暴力***过去的方法 大概就是把前缀和算 ...
随机推荐
- [C++]linux下实现rm()函数删除文件或目录
转载请注明原创:http://www.cnblogs.com/StartoverX/p/4600866.html 在linux下有两个函数可以用来删除文件: #include <unistd.h ...
- Halcon四 双目视觉的标定
原文作者写的一系列博客,挺不错的学习halcon:http://blog.sina.com.cn/s/blog_442bfe0e0100yjtn.html 1.get_image_pointer1(I ...
- 【SIKIA计划】_04_C#中级教程 (2015版)笔记
IKIC#中级教程 (2015版)正常模式指的是不会影响程序的正常运行.1,在VS中我们使用Console.Write(或者WriteLine)方法向控制台输出变量的值,通过这个我们可以查看变量的值是 ...
- python中web应用与mysql数据库交互
7使用数据库 具体使用python的DB-API,这一章里介绍如何编写代码与MYSQL数据库技术交互,这里使用一个通用的数据库API,名为DB-API. 7.1基于数据库的web应用 之前我们把日志数 ...
- Keycloak服务器安装和配置
安装地址:https://www.keycloak.org/archive/downloads-4.4.0.html 参考文档:https://www.keycloak.org/docs/latest ...
- Spring入门学习笔记(1)
目录 Spring好处 依赖注入 面向面编程(AOP) Spring Framework Core Container Web Miscellaneous 编写第一个程序 IoC容器 Spring B ...
- linux 安装配置zookeeper脚本
#!/bin/bash # automatic install zookeeper echo "========= Start to install zookeeper ========== ...
- 遇到执行SQL 的参数最大个数
报错: 传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确.此 RPC 请求中提供了过多的参数.最多应为 2100. 现象是: SQL 执行的参数过多,超过了 最大值 :2100 个. ...
- pssh命令详解
基础命令学习目录首页 原文链接:https://www.cnblogs.com/kevingrace/p/6378719.html pssh提供OpenSSH和相关工具的并行版本.包括pssh,psc ...
- Nginx中server_name 参数详解
Nginx中的server_name指令主要用于配置基于名称的虚拟主机,server_name指令在接到请求后的匹配顺序分别为: 1.准确的server_name匹配,例如: server { lis ...