[传送门]

这种区间内相同数字只能被统计一次/只有区间内数字都不相同才对答案有贡献的题都可以用扫描线扫右端点,表示当前区间右端点为$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. C#中精确计时的一点收获 Stopwatch

    http://www.cnblogs.com/jintianhu/archive/2010/09/01/1815031.html 参考: https://www.cnblogs.com/kissdod ...

  2. IdentityServer4学习及简单使用

    本文,主要用来记录IdentityServer4的简单使用. 一. IdentityServer的预备知识 要学习IdentityServer,需要了解下基于Token的验证体系,其中涉及到Token ...

  3. Trie树的java实现

    leetcode 地址: https://leetcode.com/problems/implement-trie-prefix-tree/description/ 难度:中等 描述:略 解题思路: ...

  4. 有关MFC类与其窗口句柄

    Attach,其实就是让一个CWnd对象的HWND成员指向这个窗口句柄.这就是Attach主要完成的任务. Detach.如前所述,WNDCLASS其实和CWnd根本没有什么关系.它们之间只是通过CW ...

  5. selenium 开启开发者工具(F12)

    selenium 开启开发者工具(F12) options = webdriver.ChromeOptions(); options.add_argument("--auto-open-de ...

  6. 英语fieldyellowstone田黄石fieldyellowstone单词

    田黄石(Field yellow stone),简称“田黄”,产于福州市寿山乡“寿山溪”两旁之水稻田底下.呈黄色而得名.寿山石优良品种.狭义的田黄石指“田坑石”,广义的田黄石是指其化学成分相同的一类印 ...

  7. FreePascal - CodeTyphon 如何调整代码编辑器背景色?

    当前版本的CodeTyphon默认背景色是黑色,看起来很不习惯,通过下面操作,修改了它的代码编辑器的背景色: 1,打开CodeTyphon的菜单“工具”->“选项”. 2,选择左侧列表项目“颜色 ...

  8. Weshop基于Spring Cloud开发的小程序商城系统

    WESHOP | 基于微服务的小程序商城系统 Weshop是基于Spring Cloud(Greenwich)开发的小程序商城系统,提供整套公共微服务服务模块,包含用户中心.商品中心.订单中心.营销中 ...

  9. 微服务——SpringCloud(Eureka注册中心搭建)

    IDE:IDEA,说实话,真不怎么喜欢用Eclipse这个IDE,太锻炼人了 配置模式:Grandle 微服务框架:SpringCloud 第一步 创建一个Spring Initializr项目 第二 ...

  10. mysql分析sql语句基础工具 -- explain

    分析sql语句 explain explain (sql语句) G; 分析结果: id sql语句编号如果是连接查询,表之间是平等关系,编号相同:如果有子查询,编号递增. select——type 查 ...