题意:一个长度为n的数字序列,选出其中的一个连续子串,然后统计其子串中所有数字之和(注意这里重复出现的数字只被统计一次)询问第k大的和是多少

1 <= n <= 100000, 1 <= k <= 200000, 0 <= a[i]<= 10^9

思路:类似于超级钢琴的思路

对于每一个右端点建立一棵主席树维护左端点的最大值

对于a[i]它对[last[a[i]]+1,i]有a[i]的贡献

再维护一个堆维护全局最大值

删除的时候就找到最大值的位置赋值成最小值

C++ STL 不会用 好烦

 #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<cmath>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<map>
#include<set>
#include<bitset>
#include<queue>
#include<stack>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef vector<int> VI;
#define fi first
#define se second
#define MP make_pair
#define N 21000000
#define M 110000
#define eps 1e-8
#define pi acos(-1)
#define oo 1e18
#define MOD 10007 struct node
{
ll v;
int id;
node()
{
}
node(ll V,int P)
{
v=V; id=P;
}
friend bool operator <(node x,node y)
{
return x.v<y.v;
}
}; struct tree
{
int l,r;
ll a,s;
}t[N]; priority_queue<node>q;
map<int,int>last;
int a[M],root[M],n,cnt; void pushup(int p)
{
t[p].s=;
if(!t[p].r) t[p].s=t[t[p].l].s;
else if(!t[p].l) t[p].s=t[t[p].r].s;
else t[p].s=max(t[t[p].l].s,t[t[p].r].s);
t[p].s+=t[p].a;
} void update(int l,int r,int x,int y,int v,int &r1,int r2)
{
r1=++cnt;
t[r1]=t[r2];
if(x<=l&&r<=y)
{
t[r1].a+=v;
pushup(r1);
return;
}
int mid=(l+r)>>;
if(x<=mid) update(l,mid,x,y,v,t[r1].l,t[r2].l);
if(y>mid) update(mid+,r,x,y,v,t[r1].r,t[r2].r);
pushup(r1);
} void del(int l,int r,int &p)
{
int x=p;
p=++cnt;
t[cnt]=t[x];
if(l==r)
{
t[p].a=-oo;
pushup(p);
return;
}
int mid=(l+r)>>;
if(!t[p].r) del(l,mid,t[p].l);
else if(!t[p].l) del(mid+,r,t[p].r);
else
{
if(t[t[p].l].s>=t[t[p].r].s) del(l,mid,t[p].l);
else del(mid+,r,t[p].r);
}
pushup(p);
} int main()
{
//freopen("bzoj4504.in","r",stdin);
//freopen("bzoj4504.out","w",stdout);
int k;
scanf("%d%d",&n,&k);
cnt=;
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
update(,n,i,i,,root[i],root[i-]);
update(,n,last[a[i]]+,i,a[i],root[i],root[i]);
last[a[i]]=i;
q.push(node(t[root[i]].s,i));
}
for(int i=;i<k;i++)
{
int x=q.top().id;
q.pop();
del(,n,root[x]);
q.push(node(t[root[x]].s,x));
}
printf("%lld\n",q.top().v);
return ;
}

【BZOJ4504&&Hihocoder1046】K个串(主席树,堆)的更多相关文章

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

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

  2. bzoj 4504: K个串【大根堆+主席树】

    像超级钢琴一样把五元组放进大根堆,每次取一个出来拆开,(d,l,r,p,v)表示右端点为d,左端点区间为(l,r),最大区间和值为v左端点在p上 关于怎么快速求区间和,用可持久化线段树维护(主席树?) ...

  3. spoj COT - Count on a tree (树上第K小 LCA+主席树)

    链接: https://www.spoj.com/problems/COT/en/ 思路: 首先看到求两点之前的第k小很容易想到用主席树去写,但是主席树处理的是线性结构,而这道题要求的是树形结构,我们 ...

  4. [luogu3834]静态区间第k小【主席树】

    传送门:https://www.luogu.org/problemnew/show/P3834 题目描述 如题,给定N个整数构成的序列,将对于指定的闭区间查询其区间内的第K小值. 分析 很多人都说是用 ...

  5. Dynamic Rankings || 动态/静态区间第k小(主席树)

    JYF大佬说,一星期要写很多篇博客才会有人看 但是我做题没有那么快啊QwQ Part1 写在前面 区间第K小问题一直是主席树经典题=w=今天的重点是动态区间第K小问题.静态问题要求查询一个区间内的第k ...

  6. POJ 2104 && POJ 2761 (静态区间第k大,主席树)

    查询区间第K大,而且没有修改. 使用划分树是可以做的. 作为主席树的入门题,感觉太神奇了,Orz /* *********************************************** ...

  7. zoj2112 主席树动态第k大 (主席树&&树状数组)

    Dynamic Rankings Time Limit: 10 Seconds      Memory Limit: 32768 KB The Company Dynamic Rankings has ...

  8. 静态区间第k大(主席树)

    POJ 2104为例(主席树入门题) 思想: 可持久化线段树,也叫作函数式线段树,也叫主席树(高大上). 可持久化数据结构(Persistent data structure):利用函数式编程的思想使 ...

  9. POJ 2104 K-th Number ( 求取区间 K 大值 || 主席树 || 离线线段树)

    题意 : 给出一个含有 N 个数的序列,然后有 M 次问询,每次问询包含 ( L, R, K ) 要求你给出 L 到 R 这个区间的第 K 大是几 分析 : 求取区间 K 大值是个经典的问题,可以使用 ...

  10. poj2104 K-th Number区间第k小值 主席树

    原来主席树就是可持久化线段树啊,刚知道,,, 作为一道裸题,还是必A的,然而一开始偷懒不写离散化跪了N多遍,后来在缪大的帮助下发现了这个问题,遂A之 ——又是这种破问题,实在不想说自己了 把n个数看成 ...

随机推荐

  1. 散列表的ASL计算

    题目: 已知关键字序列为{30,25,72,38,8,17,59},设散列表表长为15.散列函数是H(key)=key MOD 13,处理冲突的方法为二次探测法Hi= ( H(key) + di )m ...

  2. centos下 将(jgp、png)图片转换成webp格式

    由于项目要求需要将jpg.png类型的图片  转换成webp格式,最开始使用了php gd类库里 imagewebp 方法实现,结果发现转换成的webp格式文件会偶尔出现空白内容的情况.像创建了一个透 ...

  3. 在kali上安装谷歌浏览器

    在kali上安装谷歌浏览器的时候,遇到了很多问题,经过不懈努力,终于解决,现在把方法总结一下,希望对遇到同样问题的人能有一定帮助.这是给最白的小白参考的,大牛勿喷哈. 首先去这个网站www.googl ...

  4. Mysql关闭和修改密码

    数据库的关闭方法: 1.优雅的关闭数据库的方法:mysqladmin -uroot -p123456 shutdown 2.脚本关闭:/etc/init.d/mysqld stop 3.使用kill信 ...

  5. 2019年Vue学习路线图

    https://juejin.im/entry/5c108864f265da61726555ed 官网: https://cn.vuejs.org/index.html js引入地址 https:// ...

  6. yii2 RUL的生成

    通常情况下,会使用 yii\helpers\Url 使用Url类来生成想要的URL地址(链接) Url提供的方法大都是静态方法,不需要对类进行实例化 1.1 最常用的 Url::to() 1.2. b ...

  7. 权限组件(11):基于formset实现批量增加

    效果图: 增加页面: 编辑页面: 因为后面要对权限进行批量操作,所以先用这个示例演示下如何实现批量操作 数据库 from django.db import models class Menu(mode ...

  8. (转)Xcode6中自动布局autolayout和sizeclass的使用

    Xcode6中自动布局autolayout和sizeclass的使用   一.关于自动布局(Autolayout) 在Xcode中,自动布局看似是一个很复杂的系统,在真正使用它之前,我也是这么认为的, ...

  9. 使用WMI Filter 实现组策略的筛选!

    今天接到一个客户的一个问题,提到需要分系统版本分发相应的MSI程序.比如简体版接受简体版的分发程序,繁体版接受繁体版的分发程序!这个建立组策略的不同版本分发本身不会太难,我们只需要建立两个不同组策略分 ...

  10. 66、fastJson 解析json数据时,如果key值不同怎么处理?

    在某些场景,你可能需要定制序列化输出,比如说,希望序列化采用之后采用"ID",而不是"id",你可以使用@JSONField这个Annotation. publ ...