首先考虑二分,然后发现不可行....

注意到\(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个串 可持久化线段树 + 堆的更多相关文章

  1. 【BZOJ4504】K个串 可持久化线段树+堆

    [BZOJ4504]K个串 Description 兔子们在玩k个串的游戏.首先,它们拿出了一个长度为n的数字序列,选出其中的一个连续子串,然后统计其子串中所有数字之和(注意这里重复出现的数字只被统计 ...

  2. bzoj 4504: K个串 可持久化线段树+堆

    题目: Description 兔子们在玩k个串的游戏.首先,它们拿出了一个长度为n的数字序列,选出其中的一 个连续子串,然后统计其子串中所有数字之和(注意这里重复出现的数字只被统计一次). 兔子们想 ...

  3. hihocoder#1046: K个串

    [传送门] 这种区间内相同数字只能被统计一次/只有区间内数字都不相同才对答案有贡献的题都可以用扫描线扫右端点,表示当前区间右端点为$r$.然后当前线段树/树状数组维护区间左端点为$[1,r)$时对应的 ...

  4. SPOJ-COT-Count on a tree(树上路径第K小,可持久化线段树)

    题意: 求树上A,B两点路径上第K小的数 分析: 同样是可持久化线段树,只是这一次我们用它来维护树上的信息. 我们之前已经知道,可持久化线段树实际上是维护的一个前缀和,而前缀和不一定要出现在一个线性表 ...

  5. [POJ2104] 区间第k大数 [区间第k大数,可持久化线段树模板题]

    可持久化线段树模板题. #include <iostream> #include <algorithm> #include <cstdio> #include &l ...

  6. 树上第k小,可持久化线段树+倍增lca

    给定一颗树,树的每个结点都有权值, 有q个询问,每个询问是 u v k ,表示u到v路径上第k小的权值是多少. 每个结点所表示的线段树,是父亲结点的线段树添加该结点的权值之后形成的新的线段树 c[ro ...

  7. [POJ2104] K – th Number (可持久化线段树 主席树)

    题目背景 这是个非常经典的主席树入门题--静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个正整数构成的序列,将对于指定的闭区间查询其区间内的第K小值. 输入输 ...

  8. 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 ...

  9. POJ- 2104 hdu 2665 (区间第k小 可持久化线段树)

    可持久化线段树 也叫函数式线段树也叫主席树,其主要思想是充分利用历史信息,共用空间 http://blog.sina.com.cn/s/blog_4a0c4e5d0101c8fr.html 这个博客总 ...

随机推荐

  1. Python练习-猜年龄的LowB游戏

    Alex大神今天让我做一个猜年龄的游戏: 第一个游戏是你只能猜三次:真的很LowB啊~ # 编辑者:闫龙 #猜年龄游戏,3次后程序自动退出! ages = 29; #for循环3次 for i in ...

  2. Entity Framework Context上下文管理(CallContext 数据槽)

    Context上下文管理 Q1:脏数据 Q2:一次逻辑操作中,会多次访问数据库,增加了数据库服务器的压力 >在一次逻辑操作中实现上下文实例唯一 方法一:单例模式:内存的爆炸式增长 在整个运行期间 ...

  3. Vue学习看这篇就够

    Vue -渐进式JavaScript框架 介绍 vue 中文网 vue github Vue.js 是一套构建用户界面(UI)的渐进式JavaScript框架 库和框架的区别 我们所说的前端框架与库的 ...

  4. 跳出python的各种坑(1)

    2017-11-1915:38:17 一定要跳出python的各种坑,一开始遇到的好多思维上的认知错误,因为刚开始学习,对python是个什么都不清楚,所以记录一下自己遇到的各种坑.不用担心自己遇到的 ...

  5. MongoDB安全:内置角色概览

    官文列举如下(文档不长,过英语四级者可以轻松阅读,就不需要看本文额)(基于MongoDB 3.6的文档,4.0也没有变化): Role-Based Access Control Built-In Ro ...

  6. vue系列之项目优化

    webpack中的Code Splitting Code Splitting是什么以及为什么 在以前,为了减少HTTP请求,通常地,我们会把所有的代码都打包成一个单独的JS文件,但是,如果这个文件体积 ...

  7. CNN Architectures(AlexNet,VGG,GoogleNet,ResNet,DenseNet)

    AlexNet (2012) The network had a very similar architecture as LeNet by Yann LeCun et al but was deep ...

  8. L1和L2特征的适用场景

    How to decide which regularization (L1 or L2) to use? Is there collinearity among some features? L2 ...

  9. Vue.js 基础快速入门

    Vue.js是一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的.Vue.js提供了简洁.易于理解的API,使得我们能够快速地上手并使用Vue.js 如果之前已经习惯了用jQue ...

  10. Centos之压缩和解压缩命令

    常用压缩格式:.zip .gz .bz2 常用压缩格式:.tar.gz  .tar.bz2 zip格式压缩 zip压缩文件名 源文件 压缩文件 zip -r 压缩文件名 源目录 压缩目录 [root@ ...