[传送门]

这种区间内相同数字只能被统计一次/只有区间内数字都不相同才对答案有贡献的题都可以用扫描线扫右端点,表示当前区间右端点为$r$。然后当前线段树/树状数组维护区间左端点为$[1,r)$时对应的答案,那么新加一个数对区间$[last[a[r] + 1, r]$多了$a[r]$的贡献。
这道题也一样。只是因为对于每一个版本的线段树都得用到,所以用了可持久化线段树来维护,第$i$个版本就是右端点为$i$的版本。新加一个数只比上一个版本多了一段区间修改,那么可以用lazy标记来做,注意,这里的lazy可以不下放,因为对答案有贡献的是全局最大值,下传标记没必要(主要也是不会能下传lazy的可持久化线段树。
然后每次都把全局最大值放进优先队列,优先队列里取出最大值,并把该位置删掉,加入该版本下的次大值。重复$K$次即可。

#include <bits/stdc++.h>
#define ll long long
using namespace std; const int N = 1e5 + ;
const int M = 2e7 + ;
const ll INF = 0x3f3f3f3f3f3f3f3f; struct Node {
ll mx;
int pos;
bool operator < (const Node &rhs) const {
return mx < rhs.mx;
}
}; struct Seg {
int lp[M], rp[M];
ll lazy[M];
Node tree[M];
int tol;
void update(int &p, int q, int l, int r, int x, int y, ll val) {
p = ++tol;
if (q) tree[p] = tree[q];
lp[p] = lp[q], rp[p] = rp[q];
lazy[p] = lazy[q];
if (x <= l && y >= r) {
lazy[p] += val;
tree[p].mx += val;
if (l == r) tree[p].pos = l;
return;
}
int mid = l + r >> ;
if (x <= mid) update(lp[p], lp[q], l, mid, x, y, val);
if (y > mid) update(rp[p], rp[q], mid + , r, x, y, val);
tree[p] = max(tree[lp[p]], tree[rp[p]]);
tree[p].mx += lazy[p];
}
} seg; int root[N];
ll a[N];
priority_queue< pair<Node, int> > que;
map<int, int> last; int main() {
//printf("%d\n", sizeof(seg) / 1024 / 1024);
int n, k;
scanf("%d%d", &n, &k);
for (int i = ; i <= n; i++)
scanf("%lld", &a[i]);
seg.tree[].mx = -INF;
for (int i = ; i <= n; i++) {
seg.update(root[i], root[i - ], , n, i, i, );
seg.update(root[i], root[i], , n, last[a[i]] + , i, a[i]);
last[a[i]] = i;
que.push(pair<Node, int>(seg.tree[root[i]], i));
}
ll ans = ;
while (k--) {
Node temp = que.top().first;
int pos = temp.pos, id = que.top().second; que.pop();
ans = temp.mx;
seg.update(root[id], root[id], , n, pos, pos, -INF);
que.push(pair<Node, int>(seg.tree[root[id]], id));
}
printf("%lld\n", ans);
return ;
}

hihocoder#1046: K个串的更多相关文章

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

    首先考虑二分,然后发现不可行.... 注意到\(k\)十分小,尝试从这里突破 首先用扫描线来处理出以每个节点为右端点的区间的权值和,用可持久化线段树存下来 在所有的右端点相同的区间中,挑一个权值最大的 ...

  2. 数据结构(主席树):COGS 2213. K个串

    2213. K个串 ★★★★   输入文件:bzoj_4504.in   输出文件:bzoj_4504.out   简单对比时间限制:20 s   内存限制:512 MB [题目描述] 兔子们在玩k个 ...

  3. [bzoj P4504] K个串

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

  4. bzoj : 4504: K个串 区间修改主席树

    4504: K个串 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 268  Solved: 110[Submit][Status][Discuss] ...

  5. 问题 K: 周期串plus

    问题 K: 周期串plus 时间限制: 1 Sec  内存限制: 128 MB提交: 682  解决: 237[提交] [状态] [命题人:外部导入] 题目描述 如果一个字符串可以由某个长度为k的字符 ...

  6. hiho#1449 重复旋律6 求长度为k的串最大次数 后缀自动机

    题目传送门 题目大意:求长度为k的串的最大次数,把k从1到length的所有答案全部输出. 思路: 这道题放在$SAM$里就是求长度$k$对应的所有$right$集中最大的大小. 我们以$aabab$ ...

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

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

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

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

  9. bzoj4504 k个串 kstring 可持久化线段树 (标记永久化)

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

随机推荐

  1. golang面对对象

  2. 如何解决Requests的SSLError(转)

    add by zhj: 我使用方法2“更新系统的certificate”解决了问题 原文:https://www.jianshu.com/p/8deb13738d2c 这两天在Linux上爬Googl ...

  3. MyBatis-Plus入门Demo详解

    一.简介: 引用官方文档(本文主要参考官方文档示例): MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发.提高效率而生 ...

  4. jmeter(二十七)分布式压测注意事项

    之前的博客:jemter(二十三):分布式测试简略的介绍了利用jmeter做分布式测试的方法,当时只是介绍了背景和原因,以及基本的配置操作,有同学说写得不够详细. 正好今年双十一,我司的全链路压测,也 ...

  5. English--状语从句

    English|状语从句 现在开始讲述关于状语从句的内容,由于内容略难并且略多,我将换个简单的方式帮助理解,这一块有些东西是需要记忆的.虽然是记忆,但是我可以保证记忆的内容是知识. 前言 目前所有的文 ...

  6. Vue学习之路由vue-router小结(九)

    一.路由: 1.后端路由: 对于普通网站,所有的超链接都是URL地址,所有的URL地址都对应服务器上对应的资源: 2.前端路由: 对于单页面应用程序来说,主要通过URL中的hash(#号)来实现不同页 ...

  7. Java 之 日期时间类

    一.Date类 1.概述 java.util.Date 类 表示特定的瞬间,精确到毫秒. 2.构造方法 public Date():分配Date对象并初始化此对象,以表示分配它的时间(精确到毫秒) p ...

  8. JavaScript 之 Date对象

    Date对象 Date 是一个构造函数,首先要通过 new Date() 来创建实例对象,提供实例成员.  创建 Date 实例用来处理日期和时间.Date 对象基于 1970年1月1日(世界标准时间 ...

  9. HTML5 多媒体标签

    一.多媒体 embed 标签 embed可以用来插入各种多媒体,格式可以是 Midi.Wav.AIFF.AU.MP3等等.url为音频或视频文件及其路径,可以是相对路径或绝对路径. 语法格式: < ...

  10. React 性能优化之组件动态加载(react-loadable)

    React 项目打包时,如果不进行异步组件的处理,那么所有页面所需要的 js 都在同一文件中(bundle.js),整个js文件很大,从而导致首屏加载时间过长. 所有,可以对组件进行异步加载处理,通常 ...