hihocoder#1046 K个串 可持久化线段树 + 堆

首先考虑二分,然后发现不可行....
注意到\(k\)十分小,尝试从这里突破
首先用扫描线来处理出以每个节点为右端点的区间的权值和,用可持久化线段树存下来
在所有的右端点相同的区间中,挑一个权值最大的,放入堆中
每次从堆中取出最大元素,然后从被删除的右端点区间中选一个次大的区间
重复\(k\)次即可
复杂度\(O(n \log n + k \log n)\)
一\(A\)开心
#include <map>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define ll long long
#define ri register int
#define rep(io, st, ed) for(ri io = st; io <= ed; io ++)
#define drep(io, ed, st) for(ri io = ed; io >= st; io --)
#define gc getchar
inline int read() {
int p = 0, w = 1; char c = gc();
while(c > '9' || c < '0') { if(c == '-') w = -1; c = gc(); }
while(c >= '0' && c <= '9') p = p * 10 + c - '0', c = gc();
return p * w;
}
const int sid = 1e5 + 5;
const int eid = 2e7 + 5;
int n, k, id, a[sid], rt[sid];
map <int, int> lst;
ll tag[eid];
int ls[eid], rs[eid];
struct ym {
ll max; int maxp;
friend bool operator < (ym a, ym b)
{ return a.max < b.max; }
} t[eid];
priority_queue < pair <ym, int> > q;
inline int newnode(int pre) {
++ id;
if(pre) t[id] = t[pre]; tag[id] = tag[pre];
ls[id] = ls[pre]; rs[id] = rs[pre];
return id;
}
inline void mdf(int &o, int p, int l, int r, int ml, int mr, ll v) {
o = newnode(p);
if(ml <= l && mr >= r) {
tag[o] += v;
t[o].max += v;
if(l == r) t[o].maxp = l;
return;
}
int mid = (l + r) >> 1;
if(ml <= mid) mdf(ls[o], ls[p], l, mid, ml, mr, v);
if(mr > mid) mdf(rs[o], rs[p], mid + 1, r, ml, mr, v);
t[o] = max(t[ls[o]], t[rs[o]]); t[o].max += tag[o];
}
void wish_upon_to_the_star() {
t[0].max = -1e16;
rep(i, 1, n) {
mdf(rt[i], rt[i - 1], 1, n, i, i, 0);
mdf(rt[i], rt[i], 1, n, lst[a[i]] + 1, i, a[i]);
lst[a[i]] = i;
q.push(make_pair(t[rt[i]], i));
}
ll ans = 0;
while(k --) {
ym tmp = q.top().first;
int id = tmp.maxp, pos = q.top().second;
q.pop(); ans = tmp.max;
mdf(rt[pos], rt[pos], 1, n, id, id, -1e16);
q.push(make_pair(t[rt[pos]], pos));
}
printf("%lld\n", ans);
}
int main() {
n = read(); k = read();
rep(i, 1, n) a[i] = read();
wish_upon_to_the_star();
return 0;
}
hihocoder#1046 K个串 可持久化线段树 + 堆的更多相关文章
- 【BZOJ4504】K个串 可持久化线段树+堆
[BZOJ4504]K个串 Description 兔子们在玩k个串的游戏.首先,它们拿出了一个长度为n的数字序列,选出其中的一个连续子串,然后统计其子串中所有数字之和(注意这里重复出现的数字只被统计 ...
- bzoj 4504: K个串 可持久化线段树+堆
题目: Description 兔子们在玩k个串的游戏.首先,它们拿出了一个长度为n的数字序列,选出其中的一 个连续子串,然后统计其子串中所有数字之和(注意这里重复出现的数字只被统计一次). 兔子们想 ...
- hihocoder#1046: K个串
[传送门] 这种区间内相同数字只能被统计一次/只有区间内数字都不相同才对答案有贡献的题都可以用扫描线扫右端点,表示当前区间右端点为$r$.然后当前线段树/树状数组维护区间左端点为$[1,r)$时对应的 ...
- SPOJ-COT-Count on a tree(树上路径第K小,可持久化线段树)
题意: 求树上A,B两点路径上第K小的数 分析: 同样是可持久化线段树,只是这一次我们用它来维护树上的信息. 我们之前已经知道,可持久化线段树实际上是维护的一个前缀和,而前缀和不一定要出现在一个线性表 ...
- [POJ2104] 区间第k大数 [区间第k大数,可持久化线段树模板题]
可持久化线段树模板题. #include <iostream> #include <algorithm> #include <cstdio> #include &l ...
- 树上第k小,可持久化线段树+倍增lca
给定一颗树,树的每个结点都有权值, 有q个询问,每个询问是 u v k ,表示u到v路径上第k小的权值是多少. 每个结点所表示的线段树,是父亲结点的线段树添加该结点的权值之后形成的新的线段树 c[ro ...
- [POJ2104] K – th Number (可持久化线段树 主席树)
题目背景 这是个非常经典的主席树入门题--静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个正整数构成的序列,将对于指定的闭区间查询其区间内的第K小值. 输入输 ...
- HDU 2665.Kth number-可持久化线段树(无修改区间第K小)模板 (POJ 2104.K-th Number 、洛谷 P3834 【模板】可持久化线段树 1(主席树)只是输入格式不一样,其他几乎都一样的)
Kth number Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- POJ- 2104 hdu 2665 (区间第k小 可持久化线段树)
可持久化线段树 也叫函数式线段树也叫主席树,其主要思想是充分利用历史信息,共用空间 http://blog.sina.com.cn/s/blog_4a0c4e5d0101c8fr.html 这个博客总 ...
随机推荐
- linux可运行的shell脚本与设置开机服务启动(自己总结)
完整的ln命令参考:http://www.runoob.com/linux/linux-comm-ln.html ln :创建连接文件 - 默认创建的是硬连接,好比复制 ,但是两个文件会同步 命令:l ...
- 60、二叉搜索树的第k个结点
一.题目 给定一颗二叉搜索树,请找出其中的第k大的结点.例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4. 二.解法 package algorithm ...
- asp.net mvc 本地化 默认的错误提示
System.ComponentModel.DataAnnotations 给我们提供了一些特性来直接对model的属性进行验证和约束, 同时也提供了 ErrorMessageResourceName ...
- 原生js封装dom操作库
var utils = (function(window) { var flag = "getComputedStyle" in window; function win(attr ...
- 你真的了解js伪数组吗?深入js伪数组
关于js伪数组 具有length属性: 按索引方式存储数据: 不具有数组的push().pop()等方法: 你可能知道怎么把伪数组转换为数组,但是你知道这里边的原理吗? 假如页面有一组li元素 < ...
- bootstrap File Input 多文件上传插件使用记录(二)删除原文件
在上一篇文章中,主要介绍了file input插件的初始化和多文件同步上传到服务器的相关配置等.这篇主要介绍file input插件的编辑等. 使用场景: 在后台管理框架中,一条数据中包含不固定的多张 ...
- TObjectList
AOwnsObjects = true 就是 objectlist释放的时候,里面的对象一并释放. TObjectList对象的创建方法有一个参数:constructor TObjectList.C ...
- 20155225 实验三《敏捷开发与XP实践》实验报告
20155225 实验三<敏捷开发与XP实践>实验报告 一.使用工具(Code->Reformate Code)把代码重新格式化 IDEA里的Code菜单有很多实用的功能可以帮助我们 ...
- 出现丢包解决方法(ping: sendmsg: Operation not permitted)
故障排查: 早上突然收到nagios服务器check_icmp的报警,报警显示一台网站服务器的内网网络有问题.因为那台服务器挂载了内网的NFS,因此内网的网络就采用nagios的check_icmp来 ...
- HBase(二)CentOS7.5搭建HBase1.2.6HA集群
一.安装前提 1.HBase 依赖于 HDFS 做底层的数据存储 2.HBase 依赖于 MapReduce 做数据计算 3.HBase 依赖于 ZooKeeper 做服务协调 4.HBase源码是j ...