2018牛客网暑假ACM多校训练赛(第五场)H subseq 树状数组
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round5-H.html
题目传送门 - https://www.nowcoder.com/acm/contest/143/H
题意
给定一个序列 a[1..n],求下标字典序第 k 小的严格递增子序列
$1\leq n\leq 10^5, 0\leq k\leq 10^{18}$
题解
树状数组。
我们首先考虑如何求出从每一个下标开始取序列,能得到多少个不同的严格递增子序列。可以倒着推,设当前推到 $i$ ,则 $ans[i]=1+\sum_\limits{n\geq j>i,a[j]>a[i]}ans[j]$ 。这个东西我们可以从后往前扫一遍数组,用树状数组维护。由于我们需要防止爆 $long\ long$ , 但是 $k$ 却在 $10^{18}$ 范围内,所以我们可以重定义加法:$add(a, b) = min(a + b, 10^{18}+1)$ 。但是这样的话我们就不能使用减法了,不能差分算区间和了。但是我们发现树状数组求的是一段后缀和,于是只需要把值域翻转一下就可以了。
接下来,我们需要求字典序第 $k$ 的序列。
先把无解判掉。
然后假设当前得到的序列最后一个数字在第 $i$ 个位置,是 $a_i$ 。首先当前序列本身就是一个满足条件的子序列。设下一个比 $a_i$ 大的 数为 $a_{j_1}$ 则(按照字典序)接下来 $ans[j_1]$ 个子序列的前缀序列为当前序列再加上 $a_{j_1}$ 。类似地,设 $a_{j_2}$ 为第二个比 $a_i$ 大的数,那么再接下来 $ans[j_2]$ 个子序列的前缀序列为当前序列在加上 $a_{j_2}$ ;对于 $j_i\cdots$ 类似……直到找到了 $k$ 对应的范围,就可以得到结果序列的下一个字母。这个每次直接暴力找就可以了,时间复杂度为 $O(n)$ 。然而菜鸡博主一开始傻逼了,去写主席树,写到天昏地暗才发现直接暴力找就可以了……
总时间复杂度 $O(n\log n)$ 。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=500005;
int n,a[N],Ha[N],m=1;
LL k,INF=1000000000000000000LL;
void HASH(){
sort(Ha+1,Ha+n+1);
for (int i=2;i<=n;i++)
if (Ha[i]!=Ha[i-1])
Ha[++m]=Ha[i];
}
LL c[N],ans[N];
void add(int x,LL d){
for (x=m+1-x+1;x<=m+1;x+=x&-x)
c[x]=min(c[x]+d,INF+1);
}
LL sum(int x){
LL ans=0;
for (x=m+1-x+1;x;x-=x&-x)
ans=min(ans+c[x],INF+1);
return ans;
}
vector <int> Ans;
int main(){
scanf("%d%lld",&n,&k);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]),Ha[i]=a[i];
HASH();
for (int i=1;i<=n;i++)
a[i]=lower_bound(Ha+1,Ha+m+1,a[i])-Ha;
memset(c,0,sizeof c);
add(m+1,1);
for (int i=n;i>=1;i--)
add(a[i],ans[i]=sum(a[i]+1));
if (sum(1)<k){
puts("-1");
return 0;
}
Ans.clear();
for (int i=0;k>0;Ans.push_back(i))
for (int j=i+1;j<=n;j++){
if (a[j]<=a[i])
continue;
if (k<=ans[j]){
i=j,k--;
break;
}
k-=ans[j];
}
printf("%d\n",(int)Ans.size());
for (int i=0;i<Ans.size()-1;i++)
printf("%d ",Ans[i]);
printf("%d",*--Ans.end());
return 0;
}
2018牛客网暑假ACM多校训练赛(第五场)H subseq 树状数组的更多相关文章
- 2018牛客网暑假ACM多校训练赛(第二场)E tree 动态规划
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round2-E.html 题目传送门 - 2018牛客多校赛第二场 E ...
- 2018牛客网暑假ACM多校训练赛(第三场)I Expected Size of Random Convex Hull 计算几何,凸包,其他
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-I.html 题目传送门 - 2018牛客多校赛第三场 I ...
- 2018牛客网暑假ACM多校训练赛(第三场)G Coloring Tree 计数,bfs
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-G.html 题目传送门 - 2018牛客多校赛第三场 G ...
- 2018牛客网暑假ACM多校训练赛(第三场)D Encrypted String Matching 多项式 FFT
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-D.html 题目传送门 - 2018牛客多校赛第三场 D ...
- 2018牛客网暑假ACM多校训练赛(第五场)F take 树状数组,期望
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round5-F.html 题目传送门 - https://www.no ...
- 2018牛客网暑假ACM多校训练赛(第四场)E Skyline 线段树 扫描线
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round4-E.html 题目传送门 - https://www.no ...
- 2018牛客网暑假ACM多校训练赛(第十场)H Rikka with Ants 类欧几里德算法
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-H.html 题目传送门 - https://www.n ...
- 2018牛客网暑假ACM多校训练赛(第十场)F Rikka with Line Graph 最短路 Floyd
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-F.html 题目传送门 - https://www.n ...
- 2018牛客网暑假ACM多校训练赛(第十场)D Rikka with Prefix Sum 组合数学
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-D.html 题目传送门 - https://www.n ...
随机推荐
- 如何在eclipse中对项目进行重新编译
有时由于eclipse异常关闭,当我们重启Eclipse,在启动项目时,会报错,说:ClassNotFound类似的错误,引起这种问题的原因可能是由于,Eclipse异常关闭引起的. 解决:在一个项目 ...
- 前端 -----02 body标签中相关标签
今日内容: 字体标签: h1~h6.<font>.<u>.<b>.<strong><em>.<sup>.<sub> ...
- bootstrap DataTable绑定数据带服务器分页
<!-- DataTables --> 这两个文件在我的文件夹里面<script src="~/bower_components/datatables.net/js/jq ...
- mtu简单说明
总结:本地的mtu值==网络设备的mtu值是最优的,一般本地和网络设备的默认值都是1500(字节),没什么特殊需求,尽量不要修改 一.什么是 MTU 值 1 从字面上来说,MTU 是英文 Maxi ...
- 并发性能的隐形杀手之伪共享(false sharing)
在并发编程过程中,我们大部分的焦点都放在如何控制共享变量的访问控制上(代码层面),但是很少人会关注系统硬件及 JVM 底层相关的影响因素.前段时间学习了一个牛X的高性能异步处理框架 Disruptor ...
- 洛谷P4451 [国家集训队]整数的lqp拆分 [生成函数]
传送门 题意简述:语文不好不会写,自己看吧 思路如此精妙,代码如此简洁,实是锻炼思维水经验之好题 这种题当然是一眼DP啦. 设\(dp_n\)为把\(n\)拆分后的答案.为了方便我们设\(dp_0=1 ...
- swift 学习- 11 -- 属性
// '属性'将值跟特定的类, 结构体或枚举关联, 存储属性常量或变量作为实例的一部分,而计算属性计算(不是存储) 一个值, 计算属性可以用于 类, 结构体, 枚举, 存储属性只能用于 类 和 结构体 ...
- Confluence 6 编辑和删除用户宏
编辑一个用户宏 希望对一个用户宏进行编辑: 进入 > 基本配置(General Configuration) > 用户宏(User Macros) 在相关的宏的边上,单击 编辑(Edit ...
- sqlalchemy 的设置及使用
FLASK之数据库设置 数据库 知识点 Flask-SQLALchemy安装 连接数据库 使用数据库 数据库迁移 邮件扩展 4.1 数据库的设置 Web应用中普遍使用的是关系模型的数据库,关系型数据库 ...
- window 上安装 Scala
第一步:Java 设置 检测方法前文已说明,这里不再描述. 如果还为安装,可以参考我们的Java 开发环境配置. 接下来,我们可以从 Scala 官网地址 http://www.scala-lang. ...