题目:戳这里

学习博客:戳这里

题意:给n个数为a1~an,找到字典序第k小的序列,输出该序列所有数所在位置。

解题思路:先把所有序列预处理出来,方法是设一个数组为dp,dp[i]表示以i为开头的序列共有多少个。这样当k>dp[i],则以i为开头的序列满足不了第k小,k-=dp[i],继续往后找,知道找到k<=dp[i],则把i记录在数组ans中,--k。--k的意思是去掉了我们所记录的ans这一条序列。此时若k==0,则说明已经找到答案,跳出循环输出即可,否则继续往下找,思路还算比较常规。

那么dp数组具体怎么预处理呢?因为是求以i为开头的序列,所以类似于求后缀和,比如此时我们已经有了2 3 4,此时要插入数字1,则对1的贡献有sum[2]+sum[3]+sum[4],即1分别可以接在2,3,4前面或者只有一个1,也就是树状数组中,1的贡献=getsum(1 + 1) + 1。(getsum()为后缀和)

这里注意两个坑点:一个是a1~an范围很大,必须要离散化。二是求和有可能会爆long long (这个是真的坑,所以当大于1e18的时候,令其等于1e18就行,因为k最大就是1e18嘛。

附本人ac代码:

 1 #include<bits/stdc++.h>
2 using namespace std;
3 typedef long long ll;
4 const ll maxn = 5e6 + 10;
5 const ll inf = 1e18;
6 ll a[maxn], c[maxn], dp[maxn], b[maxn], d[maxn];
7 ll ans[maxn];
8 ll n, k;
9
10 ll lowbit(ll x)
11 {
12 return x&-x;
13 }
14 ll gsum(ll x)
15 {
16 ll ans = 0;
17 while(x <= n)
18 {
19 ans += c[x];
20 if(ans > inf) ans = inf;
21 x += lowbit(x);
22 }
23 return ans;
24 }
25 void updat(ll x, ll y)
26 {
27 while(x)
28 {
29 c[x] += y;
30 if(c[x] > inf) c[x] = inf;
31 x -= lowbit(x);
32 }
33 }
34 int main()
35 {
36
37 scanf("%lld %lld", &n, &k);
38 for(ll i = 1; i <= n; ++i)
39 {
40 scanf("%lld", &d[i]);
41 a[i] = d[i];
42 }
43 sort(a + 1, a + 1 + n);
44 for(ll i = 1; i <= n; ++i)//离散化
45 {
46 b[i] = lower_bound(a + 1, a + 1 + n, d[i]) - a;
47 }
48 dp[n] = 1;
49 updat(b[n], 1);
50 for(ll u = n - 1; u >= 1; --u)
51 {
52 dp[u] = gsum(b[u] + 1) + 1;//这一步容易写错,之前我没想到会有多个相同的数,所以一直写的是gsum(b[u])+1,wa到死。主要还是离散化用的生疏
53 updat(b[u], dp[u]);
54 }
55 int len = 0;
56 for(ll i = 1; i <= n; ++i)
57 {
58 if(b[i] > b[ans[len]])//这里同上,b[i]可能会等于b[ans[len]],所以要判断一下
59 {
60 if(k > dp[i]) k -= dp[i];
61 else
62 {
63 --k;
64 ans[++len] = i;
65 }
66 }
67 if(!k) break;
68 }
69 if(len == 0 || k)
70 {
71 puts("-1");
72 return 0;
73 }
74 printf("%d\n", len);
75 for(int i = 1; i <= len; ++i)
76 {
77 if(i > 1)
78 printf(" ");
79 printf("%lld", ans[i]);
80 }
81 printf("\n");
82 return 0;
83 }

牛客网多校第5场 H subseq 【树状数组+离散化】的更多相关文章

  1. 牛客网多校训练第一场 I - Substring(后缀数组 + 重复处理)

    链接: https://www.nowcoder.com/acm/contest/139/I 题意: 给出一个n(1≤n≤5e4)个字符的字符串s(si ∈ {a,b,c}),求最多可以从n*(n+1 ...

  2. 牛客网多校训练第九场H Cutting Bamboos

    题目链接:https://ac.nowcoder.com/acm/contest/889/H 题意:给出n颗竹子的高度,q次询问,每次询问给出l,r,x,y,每次选取[l,r]中的竹子,砍y次砍掉所有 ...

  3. 牛客多校第3场 J 思维+树状数组+二分

    牛客多校第3场 J 思维+树状数组+二分 传送门:https://ac.nowcoder.com/acm/contest/883/J 题意: 给你q个询问,和一个队列容量f 询问有两种操作: 0.访问 ...

  4. 牛客网多校第3场C-shuffle card 平衡树或stl(rope)

    链接:https://www.nowcoder.com/acm/contest/141/C 来源:牛客网 题目描述 Eddy likes to play cards game since there ...

  5. 牛客网多校第3场Esort string (kmp)

    链接:https://www.nowcoder.com/acm/contest/141/E 来源:牛客网 题目描述 Eddy likes to play with string which is a ...

  6. 牛客网多校赛第九场A-circulant matrix【数论】

    链接:https://www.nowcoder.com/acm/contest/147/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...

  7. 牛客网多校训练第二场D Kth Minimum Clique

    链接:https://ac.nowcoder.com/acm/contest/882/D来源:牛客网 Given a vertex-weighted graph with N vertices, fi ...

  8. 牛客网多校第5场 I vcd 【树状数组+离散化处理】【非原创】

    题目:戳这里 学习博客:戳这里 作者:阿狸是狐狸啦 n个点,一个点集S是好的,当且仅当对于他的每个子集T,存在一个右边无限延长的矩形,使的这个矩形包含了T,但是和S-T没有交集. 求有多少个这种集合. ...

  9. 牛客练习赛33 D tokitsukaze and Inverse Number (树状数组求逆序对,结论)

    链接:https://ac.nowcoder.com/acm/contest/308/D 来源:牛客网 tokitsukaze and Inverse Number 时间限制:C/C++ 1秒,其他语 ...

随机推荐

  1. eCATT使用前的配置

    如果想在SAP中使用eCATT,必须做一下相关的配置才行,下面简单介绍这几步:1.SM30,输入表T000,然后点击维护,或者是进入事物SCC4,进入对应的clint属性编辑视图下,将CATT and ...

  2. /bin/sh: cc: command not found

    make的时候报错:/bin/sh: cc: command not found 解决: 1. sudo yum -y install gcc gcc-c++ libstdc++-devel 2. m ...

  3. linux Jumpserver跳板机 /堡垒机详细部署

    关于跳板机/堡垒机的介绍: 跳板机的定义: 跳板机就是一台服务器,开发或运维人员在维护过程中首先要统一登录到这台服务器,然后再登录到目标设备进行维护和操作: 跳板机缺点: 没有实现对运维人员操作行为的 ...

  4. MySQL调优用户监控之show processlist

    简介 show processlist显示这台MySQL正在连接的用户: mysql> show processlist; +----+------+-----------+-------+-- ...

  5. Linux下pcstat安装踩坑教程

    首先安装golang 1.进入官方链接下载对应自己系统版本的Golang安装包:https://dl.google.com/go/go1.13.4.linux-amd64.tar.gz root@ub ...

  6. pull push 监控指标

    Prometheus 原理介绍 - 知乎 https://zhuanlan.zhihu.com/p/70090800 Prometheus由Go语言编写而成,采用Pull方式获取监控信息,并提供了多维 ...

  7. WPF入门学习(转)

    WPF基础知识 总结的学习WPF的几点基础知识: 1) C#基础语法知识(或者其他.NET支持的语言):这个是当然的了,虽然WPF是XAML配置的,但是总还是要写代码的,相信各位读者应该也都有这个基础 ...

  8. Map转换为格式化的YAML字符串

    yaml与java对象的互转 yaml与java对象的互转有snakeyaml <dependency> <groupId>org.yaml</groupId> & ...

  9. 洛谷P3850 书架

    题目描述 Knuth先生家里有个精致的书架,书架上有N本书,如今他想学到更多的知识,于是又买来了M本不同的新书.现在他要把新买的书依次插入到书架中,他已经把每本书要插入的位置标记好了,并且相应的将它们 ...

  10. 济南学习D1T5__HEAP

    死亡 [问题描述] 现在有个位置可以打sif,有个人在排队等着打sif.现在告诉你前个人每个人需要多长的时间打sif,问你第个人什么时候才能打sif.(前个人必须按照顺序来) [输入格式] 第一行两个 ...