BZOJ4504 : K个串
从左往右枚举右端点,用一棵线段树维护每个左端点的去重后的区间和。
那么对于$a[r]$,需要在$[pre[a[r]]+1,r]$里区间加上$a[r]$。
将线段树可持久化,并维护区间最大值,就可以在线询问形如“给定$r$以及$a,b$”,问$l$在$[a,b]$里$[l,r]$的区间和的最大值的问题。
用一个大根堆维护五元组$(v,x,l,r,m)$,表示区间和为$v$,所在线段树根节点为$x$,所选左端点范围为$[l,r]$,选了$m$。
然后重复$k$次,每次取出堆顶,扩展出$[l,m-1]$以及$[m+1,r]$两个新状态。
时间复杂度$O((n+k)\log n)$。
#include<cstdio>
#include<algorithm>
#include<queue>
#include<map>
using namespace std;
typedef long long ll;
typedef pair<ll,int>P;
const int N=100010,M=7000000;
int n,m,i,x,tot,T[N],l[M],r[M];ll tag[M];P v[M];map<int,int>pre;
struct E{
ll v;int x,l,r,m;
E(){}
E(ll _v,int _x,int _l,int _r,int _m){v=_v,x=_x,l=_l,r=_r,m=_m;}
inline bool operator<(const E&b)const{return v<b.v;}
}tmp;
priority_queue<E>Q;
inline void read(int&a){
char c;bool f=0;a=0;
while(!((((c=getchar())>='0')&&(c<='9'))||(c=='-')));
if(c!='-')a=c-'0';else f=1;
while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';
if(f)a=-a;
}
int build(int a,int b){
int x=++tot;
v[x]=P(0,a);
if(a==b)return x;
int mid=(a+b)>>1;
l[x]=build(a,mid),r[x]=build(mid+1,b);
return x;
}
inline int add(int x,ll p){
int y=++tot;
l[y]=l[x],r[y]=r[x],v[y]=v[x],tag[y]=tag[x]+p;
v[y].first+=p;
return y;
}
inline void pb(int x){
if(!tag[x])return;
l[x]=add(l[x],tag[x]);
r[x]=add(r[x],tag[x]);
tag[x]=0;
}
int change(int x,int a,int b,int c,int d,int p){
if(c<=a&&b<=d)return add(x,p);
pb(x);
int y=++tot;
l[y]=l[x],r[y]=r[x],v[y]=v[x];
int mid=(a+b)>>1;
if(c<=mid)l[y]=change(l[x],a,mid,c,d,p);
if(d>mid)r[y]=change(r[x],mid+1,b,c,d,p);
v[y]=max(v[l[y]],v[r[y]]);
return y;
}
P ask(int x,int a,int b,int c,int d){
if(c<=a&&b<=d)return v[x];
pb(x);
int mid=(a+b)>>1;
if(d<=mid)return ask(l[x],a,mid,c,d);
if(c>mid)return ask(r[x],mid+1,b,c,d);
return max(ask(l[x],a,mid,c,d),ask(r[x],mid+1,b,c,d));
}
inline void ext(int x,int l,int r){
if(l>r)return;
P t=ask(x,1,n,l,r);
Q.push(E(t.first,x,l,r,t.second));
}
int main(){
read(n),read(m);
for(T[0]=build(1,n),i=1;i<=n;i++){
read(x);
T[i]=change(T[i-1],1,n,pre[x]+1,i,x);
pre[x]=i;
ext(T[i],1,i);
}
while(m--){
tmp=Q.top();Q.pop();
ext(tmp.x,tmp.l,tmp.m-1);
ext(tmp.x,tmp.m+1,tmp.r);
}
return printf("%lld",tmp.v),0;
}
BZOJ4504 : K个串的更多相关文章
- bzoj4504 k个串 kstring 可持久化线段树 (标记永久化)
[fjwc2015]k个串 kstring [题目描述] 兔子们在玩k个串的游戏.首先,它们拿出了一个长度为n的数字序列,选出其中的一个连续子串,然后统计其子串中所有数字之和(注意这里重复出现的数字只 ...
- bzoj4504 K个串 (优先队列+主席树)
首先如果没有出现次数的限制的话,这题就是超级钢琴 但由于有了这个限制,不能简单地用前缀和 考虑顺着做的时候每个点的贡献,如果a[i]=x,x上次出现位置是lst[x](可以用一个map来记),那它会给 ...
- K Seq HihoCoder - 1046 || BZOJ4504 k个串
这题与超级钢琴类似,然而重复的不重复计算贡献.. 那么先求出数组nxt,nxt[i]表示第i个元素之后的第一个与其相等的元素的下标,不存在则nxt[i]=0 考虑取的区间左端点为1时的情况. 将读入序 ...
- 【BZOJ4504】K个串 可持久化线段树+堆
[BZOJ4504]K个串 Description 兔子们在玩k个串的游戏.首先,它们拿出了一个长度为n的数字序列,选出其中的一个连续子串,然后统计其子串中所有数字之和(注意这里重复出现的数字只被统计 ...
- 数据结构(主席树):COGS 2213. K个串
2213. K个串 ★★★★ 输入文件:bzoj_4504.in 输出文件:bzoj_4504.out 简单对比时间限制:20 s 内存限制:512 MB [题目描述] 兔子们在玩k个 ...
- [bzoj P4504] K个串
[bzoj P4504] K个串 [题目描述] 兔子们在玩k个串的游戏.首先,它们拿出了一个长度为n的数字序列,选出其中的一个连续子串,然后统计其子串中所有数字之和(注意这里重复出现的数字只被统计一次 ...
- bzoj : 4504: K个串 区间修改主席树
4504: K个串 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 268 Solved: 110[Submit][Status][Discuss] ...
- 问题 K: 周期串plus
问题 K: 周期串plus 时间限制: 1 Sec 内存限制: 128 MB提交: 682 解决: 237[提交] [状态] [命题人:外部导入] 题目描述 如果一个字符串可以由某个长度为k的字符 ...
- hiho#1449 重复旋律6 求长度为k的串最大次数 后缀自动机
题目传送门 题目大意:求长度为k的串的最大次数,把k从1到length的所有答案全部输出. 思路: 这道题放在$SAM$里就是求长度$k$对应的所有$right$集中最大的大小. 我们以$aabab$ ...
随机推荐
- 如何设计一个 iOS 控件?(iOS 控件完全解析) (转)
前言 一个控件从外在特征来说,主要是封装这几点: 交互方式 显示样式 数据使用 对外在特征的封装,能让我们在多种环境下达到 PM 对产品的要求,并且提到代码复用率,使维护工作保持在一个相对较小的范围内 ...
- windows服务 - C# U盘升级
1.左侧工具栏里有Timer控件,但是如果调用的是系统时间,就需要添加System.timer.timer空间下的控件. 2.服务编写之后,还不能由SCM(服务控制管理器)进行管理,需要给该服务添 ...
- Q3 2016 State of the Internet – Security Report
https://content.akamai.com/PG7476-Q3-2016-SOTI-Security-Report.html?utm_source=GoogleSearch&gcli ...
- ODATA WEB API(一)---扩展使用
一.概述 时间也算充足,抽点时间总结下OData的常用的使用方式,开放数据协议(OData)是一个查询和更新数据的Web协议.OData应用了web技术如HTTP.Atom发布协议(AtomPub)和 ...
- 基于MyEclipse6.5的ssh整合
1.编写目的 为了学习,为了更好的学习java. 为了让想要学习这个整合的人少走弯路! ! ! 2.实验环境 l MyEclipse6.5 l JBoss4.2.1 l SQL2005 l 数据库脚本 ...
- 【译】Visual Studio 15 预览版更新说明
序:恰逢Build2016大会召开,微软发布了VS2015的update2更新包和VS2016预览版.本人正在提升英文水平中,于是在这里对VS2016预览版的官方文档进行了部分翻译.因为VS有些功能使 ...
- 百度编辑器UEditor ASP.NET示例Demo 分类: ASP.NET 2015-01-12 11:18 346人阅读 评论(0) 收藏
在百度编辑器示例代码基础上进行了修改,封装成类库,只需简单配置即可使用. 完整demo下载 版权声明:本文为博主原创文章,未经博主允许不得转载.
- POJ 1163:The Triangle
Description 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1) Figure 1 shows a number triangle. Write a progr ...
- java发展史与java的语言特性
概述: Java 体系比较庞杂,功能繁多,这也导致很多人在自学 Java 的时候总是感觉无法建立 全面的知识体系, 无法从整体上把握Java 的原因. 在这里我们先简单了解一下Java 的版本. 具体 ...
- Comet:基于 HTTP 长连接的“服务器推”技术解析
原文链接:http://www.cnblogs.com/deepleo/p/Comet.html 一.背景介绍 传统web请求,是显式的向服务器发送http Request,拿到Response后显示 ...