[传送门]

这种区间内相同数字只能被统计一次/只有区间内数字都不相同才对答案有贡献的题都可以用扫描线扫右端点,表示当前区间右端点为$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. Linux下常用目录有哪些?分别有什么作用?

    /boot:这个目录是用来存放与系统启动相关的文件 /root:root用户的家目录 /bin:存放大部分的二进制的可执行文件,也就是大部分的linux命令. /tmp:这个文件目录一般是公共的,也就 ...

  2. Tomcat安装及配置(Linux系统)

    环境说明:Linux环境,CentOS 7版本. 第一步:下载tomcat 版本,下载地址:https://tomcat.apache.org/index.html 我用的是zip结尾的包 解压命令: ...

  3. hbase-indexer官网wiki

    Home Requirements Getting Started Installation Tutorial Demo Indexer Configuration CLI tools Metrics ...

  4. Echarts 学习系列(1)-5分钟上手ECharts

    目录 写在前面 下载Echarts和主题 绘制一个简单的图表 写在前面 最近,在做某个项目的时候.需要使用的可视化的图表显数据.最后,选择了百度的Echarts. 下载Echarts和主题 1.获取E ...

  5. java 泛型和object比较

    引言 我们使用object和泛型做形参,都是为了让这个方法能接收更多类型的对象,让程序变得更健壮,代码复用率更高.当我们回看自己写的代码时会发现,好像使用泛型的地方使用object也可以,使用obje ...

  6. Django---Http协议简述和原理,HTTP请求码,HTTP请求格式和响应格式(重点),Django的安装与使用,Django项目的创建和运行(cmd和pycharm两种模式),Django的基础文件配置,Web框架的本质,服务器程序和应用程序(wsgiref服务端模块,jinja2模板渲染模块)的使用

    Django---Http协议简述和原理,HTTP请求码,HTTP请求格式和响应格式(重点),Django的安装与使用,Django项目的创建和运行(cmd和pycharm两种模式),Django的基 ...

  7. Fedora搭dokuwiki的步骤 以apache2.4为例

    官网下载dokuwiki的包,解压到/var/www/html/下 修改dokuwiki的权限.拥有者/组 为apache 安装PHP 在/etc/httpd/conf 创建dokuwiki的配置文件 ...

  8. windows 下安装 node 以及安装 git 指令使用

    一.先百度搜索 node 找 Download | Node.js 二.下载 Node 根据你自己的操作系统下载 三.安装 node (注意:如果安装失败,使用管理员身份打开安装) 四.安装成功之后 ...

  9. Active Directory渗透测试典型案例

    0x01 前言 我有几个客户在渗透测试之前来找我,说他们的系统安全做得非常好,因为他们的漏洞扫描显示没有严重的漏洞并且已准备好进行安全测试,这使我在15分钟内利用AD中的错误配置获得了域管理员权限. ...

  10. Ajax跨域问题及解决方案 asp.net core 系列之允许跨越访问(Enable Cross-Origin Requests:CORS) c#中的Cache缓存技术 C#中的Cookie C#串口扫描枪的简单实现 c#Socket服务器与客户端的开发(2)

    Ajax跨域问题及解决方案   目录 复现Ajax跨域问题 Ajax跨域介绍 Ajax跨域解决方案 一. 在服务端添加响应头Access-Control-Allow-Origin 二. 使用JSONP ...