原文链接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 树状数组的更多相关文章

  1. 2018牛客网暑假ACM多校训练赛(第二场)E tree 动态规划

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round2-E.html 题目传送门 - 2018牛客多校赛第二场 E ...

  2. 2018牛客网暑假ACM多校训练赛(第三场)I Expected Size of Random Convex Hull 计算几何,凸包,其他

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-I.html 题目传送门 - 2018牛客多校赛第三场 I ...

  3. 2018牛客网暑假ACM多校训练赛(第三场)G Coloring Tree 计数,bfs

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-G.html 题目传送门 - 2018牛客多校赛第三场 G ...

  4. 2018牛客网暑假ACM多校训练赛(第三场)D Encrypted String Matching 多项式 FFT

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-D.html 题目传送门 - 2018牛客多校赛第三场 D ...

  5. 2018牛客网暑假ACM多校训练赛(第五场)F take 树状数组,期望

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round5-F.html 题目传送门 - https://www.no ...

  6. 2018牛客网暑假ACM多校训练赛(第四场)E Skyline 线段树 扫描线

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round4-E.html 题目传送门 - https://www.no ...

  7. 2018牛客网暑假ACM多校训练赛(第十场)H Rikka with Ants 类欧几里德算法

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-H.html 题目传送门 - https://www.n ...

  8. 2018牛客网暑假ACM多校训练赛(第十场)F Rikka with Line Graph 最短路 Floyd

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-F.html 题目传送门 - https://www.n ...

  9. 2018牛客网暑假ACM多校训练赛(第十场)D Rikka with Prefix Sum 组合数学

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-D.html 题目传送门 - https://www.n ...

随机推荐

  1. Centos 6 安装FreeSWITCH

    为了安装FreeSWITCH ,我选择的Linux是CentOS,目前最新的Centos版本是6.具体安装CentOS的是步骤详见网上的其它资料,本节的主要目的是为了记录FreeSWITCH的安装过程 ...

  2. 数据库之删除表数据drop、truncate和delete的用法

    数据库中删除表数据的关键字,最常用的可能就是delete了,另外其实还有drop和truncate两个关键字. 老大:drop 命令格式:drop table  tb  ---tb表示数据表的名字,下 ...

  3. [转]Navicat Premium 12试用期的破解方法

    link: https://blog.csdn.net/Jason_Julie/article/details/82864187 ref: https://www.jianshu.com/p/42a3 ...

  4. python-包及日志模块使用

    一.包 1.包就是一个保护有__init__.py文件的文件夹,包的本质就是一种模块,即包是用来导入使用的,包内部包含的文件也都是用来被导入使用的.包是为了更好组织好模块,就是一个文件夹. 注:在py ...

  5. restricted 模式及其 使用

    什么是数据库的RESTRICTED 模式 注:以下内容来至:百度知道 --数据库受限模式,在这个模式下只有RESTRICTED SESSION 权限的人才可以登陆,一般用与数据库维护的时候使用. RE ...

  6. day04 运算符 流程控制 (if while/of)

    1. 运算符算数运算符 + - * / int / float :数字类型 # print(10 + 3.1)# print(10 / 3)# print(10 // 3)# print(10 % 3 ...

  7. x学生管理系统(用中间件)-------基于FORM组件

    目的:实现学生,老师,课程的增删改查 models.py from django.db import models # Create your models here. class UserInfo( ...

  8. Layers Of Caffe

    本文试图描述构建一个网络结构的layers,可以用prototxt脚本直接写,也可以用python接口实现. 最简单的神经网络包含但不限于以下四部分: 数据层(Data): Data.ImageDat ...

  9. samba 二进制包 tar.gz 安装

    一.下载 sudo wget https://download.samba.org/pub/samba/stable/samba-4.8.10.tar.gz 二.解压 sudu tar -xvzf s ...

  10. bzoj 1812

    什么鬼noip互测题... 这题很显然是树形dp,但设计状态以及转移是个难点 记状态f[i][j][k]表示以i为根节点的子树,离i最近的祖宗节点编号为j放了虫洞(伐木场?),i的子树内放了k个伐木场 ...