数据结构(主席树):COGS 2213. K个串
2213. K个串
★★★★ 输入文件:bzoj_4504.in 输出文件:bzoj_4504.out 简单对比
时间限制:20 s 内存限制:512 MB
【题目描述】
【输入格式】
【输出格式】
【样例输入】
7 5
3 -2 1 2 2 1 3 -2
【样例输出】
4
【提示】
1 <= n <= 100000, 1 <= k <= 200000, 0 <= |a_i| <= 10^9数据保证存在第 k 大的和
和HDU 5654 xiaoxin and his watermelon candy几乎一模一样。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn=;
const int INF=;
int hash[maxn],a[maxn],n,k;
int head[maxn],nxt[maxn],pre[maxn];
int rt[maxn],pos[maxn<<];
int ch[maxn<<][],cnt;
long long lx[maxn<<],tr[maxn<<];
void Push_up(int x){
int l=ch[x][],r=ch[x][];
tr[x]=tr[l]+tr[r];
if(lx[l]>tr[l]+lx[r]){
lx[x]=lx[l];
pos[x]=pos[l];
}
else{
lx[x]=tr[l]+lx[r];
pos[x]=pos[r];
}
}
void Build(int &rt,int l,int r){
rt=++cnt;
if(l==r){
pos[rt]=l;
if(!pre[l]){
tr[rt]=hash[a[l]];
lx[rt]=hash[a[l]];
}
return;
}
int mid=(l+r)>>;
Build(ch[rt][],l,mid);
Build(ch[rt][],mid+,r);
Push_up(rt);
} void Update(int pr,int &rt,int l,int r,int g,int d){
rt=++cnt;
tr[rt]=tr[pr]+d;
if(l==r){
pos[rt]=g;
lx[rt]=tr[rt];
return;
}
ch[rt][]=ch[pr][];
ch[rt][]=ch[pr][];
int mid=(l+r)>>;
if(g<=mid)Update(ch[pr][],ch[rt][],l,mid,g,d);
else Update(ch[pr][],ch[rt][],mid+,r,g,d);
Push_up(rt);
}
struct data{int x;long long y;};
data Query(int t,int l,int r,int x,int y)
{
if(l==x && r==y) return (data){pos[t],lx[t]};
int mid=(l+r)>>;
if(y<=mid) return Query(ch[t][],l,mid,x,y);
else if(x>mid){
data tmp=Query(ch[t][],mid+,r,x,y);
return (data){tmp.x,tmp.y+tr[ch[t][]]};
}
else{
data tmp1=Query(ch[t][],l,mid,x,mid);
data tmp2=Query(ch[t][],mid+,r,mid+,y);
if(tmp1.y>tmp2.y+tr[ch[t][]]) return tmp1;
else return (data){tmp2.x,tmp2.y+tr[ch[t][]]};
}
} struct node{int i,l,r,x; long long y;};
bool operator<(const node& a1,const node& a2)
{return a1.y<a2.y;}
priority_queue<node> q; int main(){
freopen("bzoj_4504.in","r",stdin);
freopen("bzoj_4504.out","w",stdout);
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
for(int i=;i<=n;i++)
hash[i]=a[i];
sort(hash+,hash+n+);
for(int i=;i<=n;i++)
a[i]=lower_bound(hash+,hash+n+,a[i])-hash;
for(int i=;i<=n;i++){
pre[i]=head[a[i]];
nxt[head[a[i]]]=i;
head[a[i]]=i;
}
Build(rt[],,n);
for(int i=;i<n;i++){
Update(rt[i],rt[i+],,n,i+,-hash[a[i]]);
if(nxt[i])Update(rt[i+],rt[i+],,n,nxt[i],hash[a[i]]);
}
for(int i=;i<=n;i++){
data tmp=Query(rt[i],,n,i,n);
q.push((node){i,i,n,tmp.x,tmp.y});
}
long long ans;
for(int i=;i<=k;i++){
node t=q.top(); q.pop(); ans=t.y;
if(t.l!=t.x){
data tmp=Query(rt[t.i],,n,t.l,t.x-);
q.push((node){t.i,t.l,t.x-,tmp.x,tmp.y});
}
if(t.r!=t.x){
data tmp=Query(rt[t.i],,n,t.x+,t.r);
q.push((node){t.i,t.x+,t.r,tmp.x,tmp.y});
}
}
printf("%lld\n",ans);
return ;
}
有时间一定要重打!!!
数据结构(主席树):COGS 2213. K个串的更多相关文章
- 数据结构(主席树):COGS 2211. 谈笑风生
2211. 谈笑风生 ★★★★ 输入文件:laugh.in 输出文件:laugh.out 简单对比时间限制:3 s 内存限制:512 MB [问题描述] 设T 为一棵有根树,我们做如下 ...
- POJ 2104 K-th Number 主席树(区间第k大)
题目链接: http://poj.org/problem?id=2104 K-th Number Time Limit: 20000MSMemory Limit: 65536K 问题描述 You ar ...
- POJ 2104:K-th Number(主席树静态区间k大)
题目大意:对于一个序列,每次询问区间[l,r]的第k大树. 分析: 主席树模板题 program kthtree; type point=record l,r,s:longint; end; var ...
- zoj2112 主席树动态第k大 (主席树&&树状数组)
Dynamic Rankings Time Limit: 10 Seconds Memory Limit: 32768 KB The Company Dynamic Rankings has ...
- HDU 6278 主席树(区间第k大)+二分
Just h-index Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others)To ...
- 主席树区间第K大
主席树的实质其实还是一颗线段树, 然后每一次修改都通过上一次的线段树,来添加新边,使得每次改变就改变logn个节点,很多节点重复利用,达到节省空间的目的. 1.不带修改的区间第K大. HDU-2665 ...
- codeforces 1262D Optimal Subsequences 主席树询问第k小
题意 给定长度为\(n\)的序列\(a\),以及m个询问\(<k,pos>\),每次询问满足下列条件的子序列中第\(pos\)位的值为多少. 子序列长度为\(k\) 序列和是所有长度为\( ...
- 牛客多校第九场H Cutting Bamboos(主席树 区间比k小的个数)题解
题意: 标记为\(1-n\)的竹子,\(q\)个询问,每次给出\(l,r,x,y\).要求为砍区间\(l,r\)的柱子,要求砍\(y\)次把所有竹子砍完,每次砍的时候选一个高度,把比他高的都砍下来,并 ...
- 数据结构(主席树):HDU 5654 xiaoxin and his watermelon candy
Problem Description During his six grade summer vacation, xiaoxin got lots of watermelon candies fro ...
随机推荐
- AIX系统上压缩与解压文件
压缩. 命令格式: #tar -cvf (或xvf)+文件名+设备 C:是本地到其他设备 x:是其他设备到本地 r:是追加,比如打包时,将其他文件追加进来使用该参数. t:显示tar包里的内容,但还原 ...
- 9.22 noip模拟试题
水灾(sliker.cpp/c/pas) 1000MS 64MB 大雨应经下了几天雨,却还是没有停的样子.土豪CCY刚从外地赚完1e元回来,知道不久除了自己别墅,其他的地方都将会被洪水淹没. CCY ...
- C#学习第一天
主要看了一些关于C#的发展期情况,对这门语言有了初步的了解,下面慢慢道来. 首先是C#语言的特点,相比较其他的语言,C#具有以下突出的特点: 1.语法简洁,不允许直接操作内存,去掉了指针操作: 2.彻 ...
- maven 依赖冲突的问题
如果原始系统的jarA依赖jarB1.0 而新引入的jarC依赖jarB2.0 导致系统启动报错,提示冲突,这时为了保证原始系统的稳定性, 在pom.xml文件中引入jarC时,需要exclude掉j ...
- android 简单的开机自启
今天我们主要来探讨android怎么让一个service开机自动启动功能的实现.Android手机在启动的过程中会触发一个Standard Broadcast Action,名字叫android.in ...
- 线程同步(AutoResetEvent与ManualResetEvent)
前言 在我们编写多线程程序时,会遇到这样一个问题:在一个线程处理的过程中,需要等待另一个线程处理的结果才能继续往下执行.比如:有两个线程,一个用来接收Socket数据,另一个用来处理Socket数据, ...
- 【转】iOS开发6:UIActionSheet与UIAlertView
原文: http://my.oschina.net/plumsoft/blog/42763 iOS程序中的Action Sheet就像Windows中的 “确定-取消”对话框一样,用于强制用户进行选择 ...
- ITEXTSHARP学习整理
学习的版本iTextSharp.5.5.5. 关于获取PDF中的图片资源 /// <summary> /// 将PDF中的图片资源转换成二进制 /// </summary> / ...
- 【HDU3802】【降幂大法+矩阵加速+特征方程】Ipad,IPhone
Problem Description In ACM_DIY, there is one master called “Lost”. As we know he is a “-2Dai”, which ...
- linux之uniq
Linux命令uniq的作用是过滤重复部分显示文件内容,这个命令读取输入文件,并比较相邻的行.在正常情况下,第二个及以后更多个重复行将被删去,行 比较是根据所用字符集的排序序列进行的.该命令加工后的结 ...