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

注意到\(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. JDK1.8源码ArrayList

    线程不安全的,如果要想线程安全必须在创建的时候就采用线程安全的方式创建: List list = Collections.synchronizedList(new ArrayList(...)); 引 ...

  2. 2018ICPC南京网络赛

    2018ICPC南京网络赛 A. An Olympian Math Problem 题目描述:求\(\sum_{i=1}^{n} i\times i! \%n\) solution \[(n-1) \ ...

  3. re-sign重签名

    准备: ① re-sign.jar重签名工具:(下载地址为:http://troido.de/downloads/category/1): ② 从D:\Android\sdk\build-tools\ ...

  4. spring单元测试的基本配置

    @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:trade.ap ...

  5. 缓存数据库-redis数据类型和操作(set)

    一:Redis 集合(Set) Redis的Set是string类型的无序集合.集合成员是唯一的,这就意味着集合中不能出现重复的数据. Redis 中 集合是通过哈希表实现的,所以添加,删除,查找的复 ...

  6. 统计学习方法九:EM算法

    一.EM算法是什么? EM算法是一种迭代算法,用于含有隐变量的概率模型参数的极大似然估计. 作用:简单直白的说,估计参数 是一种生成模型 (1)用在概率模型中 (2)含有隐变量 (3)用极大似然估计方 ...

  7. UFLDL 教程学习笔记(三)

    教程地址:http://ufldl.stanford.edu/tutorial/supervised/SoftmaxRegression/ logstic regression是二分类的问题,如果想要 ...

  8. 使用html+css+js实现3D相册

    使用html+css+js实现3D相册,快来上传的照片吧 效果图: 代码如下,复制即可用: <!DOCTYPE html> <html lang="en"> ...

  9. 使用SQL语句查询某表中所有的主键、唯一索引以及这些主键、索引所包含的字段(转)

    SELECT 索引名称 = a.name , 表名 = c.name , 索引字段名 = d.name , 索引字段位置 = d.colid FROM sysindexes a JOIN sysind ...

  10. 日志、字段备注查询、自增ID联系设置、常用存储过程

    -----获取数据字典SQL(表字段说明)SELECT     [Table Name] = OBJECT_NAME(c.object_id),     [Column Name] = c.name, ...