牛客网多校第5场 H subseq 【树状数组+离散化】
题目:戳这里
学习博客:戳这里
题意:给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 【树状数组+离散化】的更多相关文章
- 牛客网多校训练第一场 I - Substring(后缀数组 + 重复处理)
链接: https://www.nowcoder.com/acm/contest/139/I 题意: 给出一个n(1≤n≤5e4)个字符的字符串s(si ∈ {a,b,c}),求最多可以从n*(n+1 ...
- 牛客网多校训练第九场H Cutting Bamboos
题目链接:https://ac.nowcoder.com/acm/contest/889/H 题意:给出n颗竹子的高度,q次询问,每次询问给出l,r,x,y,每次选取[l,r]中的竹子,砍y次砍掉所有 ...
- 牛客多校第3场 J 思维+树状数组+二分
牛客多校第3场 J 思维+树状数组+二分 传送门:https://ac.nowcoder.com/acm/contest/883/J 题意: 给你q个询问,和一个队列容量f 询问有两种操作: 0.访问 ...
- 牛客网多校第3场C-shuffle card 平衡树或stl(rope)
链接:https://www.nowcoder.com/acm/contest/141/C 来源:牛客网 题目描述 Eddy likes to play cards game since there ...
- 牛客网多校第3场Esort string (kmp)
链接:https://www.nowcoder.com/acm/contest/141/E 来源:牛客网 题目描述 Eddy likes to play with string which is a ...
- 牛客网多校赛第九场A-circulant matrix【数论】
链接:https://www.nowcoder.com/acm/contest/147/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...
- 牛客网多校训练第二场D Kth Minimum Clique
链接:https://ac.nowcoder.com/acm/contest/882/D来源:牛客网 Given a vertex-weighted graph with N vertices, fi ...
- 牛客网多校第5场 I vcd 【树状数组+离散化处理】【非原创】
题目:戳这里 学习博客:戳这里 作者:阿狸是狐狸啦 n个点,一个点集S是好的,当且仅当对于他的每个子集T,存在一个右边无限延长的矩形,使的这个矩形包含了T,但是和S-T没有交集. 求有多少个这种集合. ...
- 牛客练习赛33 D tokitsukaze and Inverse Number (树状数组求逆序对,结论)
链接:https://ac.nowcoder.com/acm/contest/308/D 来源:牛客网 tokitsukaze and Inverse Number 时间限制:C/C++ 1秒,其他语 ...
随机推荐
- 面试时通过volatile关键字,全面展示线程内存模型的能力
面试时,面试官经常会通过volatile关键字来考核候选人在多线程方面的能力,一旦被问题此类问题,大家可以通过如下的步骤全面这方面的能力. 1 首先通过内存模型说明volatile关键字的作用 ...
- js实现简单的俄罗斯方块小游戏
js实现简单的俄罗斯方块小游戏 开始 1. 创建一个宽为 200px,高为 360px 的背景容器 <!DOCTYPE html> <html lang="en" ...
- PCB导线长宽与电源压降
为了计算PCB中电源线走线后的压降,需要知道PCB中使用的铜的电阻率, PCB板中的铜是直接贴上去的铜箔,因此可以当成纯铜(我问了PCB打样的厂家他们的铜的电阻率,但是他们给我说不知道,所以干脆就当成 ...
- 提示框,对话框,路由跳转页面,跑马灯,幻灯片及list组件的应用
目录: 主页面的js业务逻辑层 主页面视图层 主页面css属性设置 跳转页面一的js业务逻辑层 跳转页面一的视图层 跳转页面二的视图层 跳转页面三的js业务逻辑层 跳转页面三的视图层 跳转页面三的cs ...
- 自导自演的面试现场,趣学MySQL的10种文件
导读 Hi,大家好!我是白日梦!本文是MySQL专题的第 24 篇. 今天我要跟你分享的MySQL话题是:"自导自演的数据库面试现场--谈谈MySQL的10种文件" 换一种写作风格 ...
- protoc-gen-validate (PGV)
https://github.com/envoyproxy/protoc-gen-validate This project is currently in alpha. The API should ...
- 。SLI,Service Level Indicator,服务等级指标,其实就是我们选择哪些指标来衡量我们的稳定性。而 SLO,Service Level Objective,服务等级目标,指的就是我们设定的稳定性目标,比如“几个 9”这样的目标。
.SLI,Service Level Indicator,服务等级指标,其实就是我们选择哪些指标来衡量我们的稳定性.而 SLO,Service Level Objective,服务等级目标,指的就是我 ...
- 向同一个模型的外键反向关联名称产生了冲突 Django迁移
向同一个模型的外键反向关联名称产生了冲突 一个模型中有两个外键指向同一张表时,创建迁移模型时报错:" HINT: Add or change a related_name argument ...
- 静电、浪涌与TVS
ESD和浪涌问题往往是基带工程师最头疼的问题,因为测试标准严苛,问题神出鬼没.特别是ESD问题,没有解决问题的标准路径,只能靠反复地构思方案并验证.想要尽量避免以上问题,就必须选择合适的防护器件,设计 ...
- JAVA中两个int类型的变量在不借助第三个变量的情况下完成值的互换
在面试中被问到这个问题,想到两种解决方式,在此分享一下. 第一种,使用简单的数学运算达到目标(但是面试官往往会问你还有没有其他方式): public static void main(String[] ...