BZOJ 4504: K个串
题目大意:
求一个序列的第k大的子串和。
题解:
对于一个右端点找最优的左端点,扔进堆里。
每次取堆顶,将这个右端点可以选择的左端点的区间分成两段,扔进堆里,重复k次。
现在需要对于一个固定的右端点,左端点在一个区间里,求最大值。
可持久化线段树上区间修改,不用标记永久化也可以过。
代码:
#include<cstdio>
#include<algorithm>
#include<map>
#include<queue>
#define mp make_pair
#define pr pair<long long,int>
#define prr pair<pr,pr>
#define fr first
#define sc second
using namespace std;
int n,k,cnt,ls[10000005],rs[10000005],root[200005];
long long tag[10000005];
priority_queue<prr> q;
map<int,int> pre;
struct node{
long long val;
int id;
}tree[10000005];
void build(int &x,int l,int r){
x=++cnt;
tree[x]=(node){0,l};
if (l==r) return;
int mid=(l+r)>>1;
build(ls[x],l,mid);
build(rs[x],mid+1,r);
}
void add(int &now,int pre,long long key){
now=++cnt;
ls[now]=ls[pre],rs[now]=rs[pre],tree[now]=tree[pre],tag[now]=tag[pre]+key;
tree[now].val+=key;
}
void push_down(int x){
if (!tag[x]) return;
add(ls[x],ls[x],tag[x]);
add(rs[x],rs[x],tag[x]);
tag[x]=0;
}
void insert(int &now,int pre,int l,int r,int x,int y,int key){
if (l>y || r<x) return;
if (l>=x && r<=y){
add(now,pre,key);
return;
}
push_down(pre);
now=++cnt;
ls[now]=ls[pre],rs[now]=rs[pre],tree[now]=tree[pre];
int mid=(l+r)>>1;
insert(ls[now],ls[pre],l,mid,x,y,key);
insert(rs[now],rs[pre],mid+1,r,x,y,key);
if (tree[rs[now]].val>tree[ls[now]].val) tree[now]=tree[rs[now]];
else tree[now]=tree[ls[now]];
}
node query(int now,int l,int r,int x,int y){
if (!now) return (node){-1ll<<60,0};
if (l>y || r<x) return (node){-1ll<<60,0};
if (l>=x && r<=y) return tree[now];
push_down(now);
int mid=(l+r)>>1;
node max1=query(ls[now],l,mid,x,y);
node max2=query(rs[now],mid+1,r,x,y);
if (max1.val>max2.val) return max1;
else return max2;
}
void insert(int x,int l,int r){
if (l>r) return;
node sum=query(x,1,n,l,r);
q.push(mp(mp(sum.val,x),mp(l,r)));
}
int main(){
scanf("%d%d",&n,&k);
build(root[0],1,n);
for (int i=1; i<=n; i++){
int x;
scanf("%d",&x);
insert(root[i],root[i-1],1,n,pre[x]+1,i,x);
pre[x]=i;
insert(root[i],1,i);
}
long long sum;
while (k--){
sum=q.top().fr.fr;
int id=q.top().fr.sc,l=q.top().sc.fr,r=q.top().sc.sc;
q.pop();
int mid=query(id,1,n,l,r).id;
insert(id,l,mid-1);
insert(id,mid+1,r);
}
printf("%lld\n",sum);
return 0;
}
BZOJ 4504: K个串的更多相关文章
- bzoj : 4504: K个串 区间修改主席树
4504: K个串 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 268 Solved: 110[Submit][Status][Discuss] ...
- bzoj 4504: K个串 可持久化线段树+堆
题目: Description 兔子们在玩k个串的游戏.首先,它们拿出了一个长度为n的数字序列,选出其中的一 个连续子串,然后统计其子串中所有数字之和(注意这里重复出现的数字只被统计一次). 兔子们想 ...
- bzoj 4504: K个串【大根堆+主席树】
像超级钢琴一样把五元组放进大根堆,每次取一个出来拆开,(d,l,r,p,v)表示右端点为d,左端点区间为(l,r),最大区间和值为v左端点在p上 关于怎么快速求区间和,用可持久化线段树维护(主席树?) ...
- [bzoj P4504] K个串
[bzoj P4504] K个串 [题目描述] 兔子们在玩k个串的游戏.首先,它们拿出了一个长度为n的数字序列,选出其中的一个连续子串,然后统计其子串中所有数字之和(注意这里重复出现的数字只被统计一次 ...
- bzoj4504 k个串 kstring 可持久化线段树 (标记永久化)
[fjwc2015]k个串 kstring [题目描述] 兔子们在玩k个串的游戏.首先,它们拿出了一个长度为n的数字序列,选出其中的一个连续子串,然后统计其子串中所有数字之和(注意这里重复出现的数字只 ...
- 数据结构(主席树):COGS 2213. K个串
2213. K个串 ★★★★ 输入文件:bzoj_4504.in 输出文件:bzoj_4504.out 简单对比时间限制:20 s 内存限制:512 MB [题目描述] 兔子们在玩k个 ...
- BZOJ 3110 K大数查询 | 整体二分
BZOJ 3110 K大数查询 题面 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个 ...
- 问题 K: 周期串plus
问题 K: 周期串plus 时间限制: 1 Sec 内存限制: 128 MB提交: 682 解决: 237[提交] [状态] [命题人:外部导入] 题目描述 如果一个字符串可以由某个长度为k的字符 ...
- hiho#1449 重复旋律6 求长度为k的串最大次数 后缀自动机
题目传送门 题目大意:求长度为k的串的最大次数,把k从1到length的所有答案全部输出. 思路: 这道题放在$SAM$里就是求长度$k$对应的所有$right$集中最大的大小. 我们以$aabab$ ...
随机推荐
- 090 Subsets II 子集 II
给定一个可能包含重复整数的列表,返回所有可能的子集(幂集).注意事项:解决方案集不能包含重复的子集.例如,如果 nums = [1,2,2],答案为:[ [2], [1], [1,2,2], ...
- gem install 提示rubygems.org连接不上的问题
周五的时候安装compass时遇到的,总是报错,后来反应过来是被墙了.解决办法就是使用淘宝的rubygem的镜像 gem sources --remove https://rubygems.org/ ...
- [转]依赖注入框架Autofac的简单使用
本文转自:http://www.nopchina.net/post/autofac.html 话说nopcommerce底层用到了autofac框架,这里转了一篇文章简单说明一下: Autofac是一 ...
- 死磕 java并发包之AtomicStampedReference源码分析(ABA问题详解)
问题 (1)什么是ABA? (2)ABA的危害? (3)ABA的解决方法? (4)AtomicStampedReference是什么? (5)AtomicStampedReference是怎么解决AB ...
- jQuery事件,对象以及插件
回顾 1 基本使用 2 jquery 选择器 3 筛选器 过滤 查找 串联 4 DOM 操作 内部插入 append()appendTo()prepend()prependTo() 外部插入 afte ...
- Android 6.0 运行时权限处理完全解析 (摘抄)
转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/50709663: 本文出自:[张鸿洋的博客] 一.概述 随着Android 6. ...
- cacti添加被监控机全过程
在被监控端上的操作: 1.在被监控机器上root目录下建立文件 test.sh chmod 777 test.sh cat test #!/bin/bash echo $RANDOM 2.在snmpd ...
- 明白这十个故事-->你也就参悟了人生 .
1.断箭 不相信自己的意志,永远也做不成将军. 春秋战国时代,一位父亲和他的儿子出征打仗.父亲已做了将军,儿子还只是马前卒.又一阵号角吹响,战鼓雷鸣了,父亲庄严地托起一个箭囊,其中插着一只箭.父亲郑 ...
- Thread源码分析-java8
1.Thread特性分析 守护线程Daemon 定性:支持性线程,主要用于程序中后台调度以及支持性工作. 当JVM中不存在Daemon线程时,JVM将会退出. 将一个线程设定为Daemon的方法: 调 ...
- python基础面试题整理---从零开始 每天十题(01)
最近在弄flask的东西,好久没写博客的,感觉少了点什么,感觉被别人落下好多,可能渐渐的养成了写博客的习惯吧.也是自己想学的东西太多了(说白了就是基础太差了,只是know how,不能做到konw w ...