牛客小白月赛65 E题 题解
题意描述
构造一个\(1\)到\(n\)的排列,使得其中正好有\(k\)个二元组\((i, j)\)满足,\(1\le i\lt j\le n\) && \(a_i - a_j = 2^x(x\in N)\)
\((1\le n \le 10^6, 1\le k \le 10^9)\)
做法分析
首先我们可以发现,每个数,它在序列能构成有用二元组的只有比他大的,那也就是说我们找到了排列的二元组最多情况,也就是\(n\)到\(1\)按从大到小顺序排列。
那进一步想,每个数在序列中最大能对他有用的数(即能构成二元组的)有多少个呢,发现对于每个数\(i\),满足\(i+2^x\le n\)的最大的\(x\)再\(+1\)即为每个数的最大贡献,其实也就是\(\log_2( {n - i} )+ 1\)。
这样就有了构造方法,对于每个不是\(n\)(没有比\(n\)大的数了)的数\(i\),如果\(\log_2( {n - i} )+ 1\)\(\le k\),那就将\(k\)减去其贡献值,并把他放到最后。
举个例子:
输入:5 5
得到:3 4 5 2 1
从\(1\)开始,他的贡献最大是\(\log_2( {5 - 1} )+ 1 = 3\),可以与\(2,3,5\)形成二元组,小于\(k\),于是\(k\)减\(3\),标记一下\(1\)被放到后面了。
再到\(2\),贡献是\(\log_2( {5 - 2} )+ 1 = 2\),可以与\(3,4\)形成二元组,小于等于\(k\),于是\(k\)减\(2\),标记一下\(2\)被放到后面了,这时候\(k\)已经等于\(0\)了,即我们构造的排列已经符合要求。
这样应该就很清楚了,时间复杂度\(O(n)\)。
代码
#include <bits/stdc++.h>
using namespace std;
int n, k;
int flag1[1000010], flag2[1000010];
int lg[1000010];
int main()
{
scanf("%d%d", &n, &k);
for(int i = 2; i <= n; i++)
lg[i] = lg[i >> 1] + 1;
for(int i = 1; i <= n; i++)
flag1[i] = 1;
for(int i = 1; i < n; i++)
{
int cha = n - i;
if(lg[cha] + 1 <= k)
{
flag1[i] = 0;
flag2[i] = 1;
k -= lg[cha] + 1;
}
if(k == 0)
break;
}
if(k > 0)
{
printf("-1");
return 0;
}
for(int i = 1; i <= n; i++)
if(flag1[i])
printf("%d ", i);
for(int i = n; i >= 1; i--)
if(flag2[i])
printf("%d ", i);
return 0;
}
牛客小白月赛65 E题 题解的更多相关文章
- 牛客小白月赛6 水题 求n!在m进制下末尾0的个数 数论
链接:https://www.nowcoder.com/acm/contest/135/C来源:牛客网 题目描述 其中,f(1)=1;f(2)=1;Z皇后的方案数:即在Z×Z的棋盘上放置Z个皇后,使其 ...
- 牛客小白月赛65——D-牛牛取石子
链接:https://ac.nowcoder.com/acm/contest/49888/D来源:牛客网 牛牛和牛妹在玩游戏,他们的游戏规则是这样的: 一共有两堆石子,第一堆有 aaa 个,第二堆有 ...
- 【牛客小白月赛70】A-F题解【小d和超级泡泡堂】【小d和孤独的区间】【小d的博弈】【小d和送外卖】
比赛传送门:https://ac.nowcoder.com/acm/contest/53366 难度适中. 作者:Eriktse 简介:19岁,211计算机在读,现役ACM银牌选手力争以通俗易懂的方式 ...
- 树的最长链-POJ 1985 树的直径(最长链)+牛客小白月赛6-桃花
求树直径的方法在此转载一下大佬们的分析: 可以随便选择一个点开始进行bfs或者dfs,从而找到离该点最远的那个点(可以证明,离树上任意一点最远的点一定是树的某条直径的两端点之一:树的直径:树上的最长简 ...
- 【牛客小白月赛21】NC201605 Bits
[牛客小白月赛21]NC201605 Bits 题目链接 题目描述 Nancy喜欢做游戏! 汉诺塔是一个神奇的游戏,神奇在哪里呢? 给出3根柱子,最开始时n个盘子按照大小被置于最左的柱子. 如果盘子数 ...
- 牛客小白月赛16 小石的妹子 二分 or 线段树
牛客小白月赛16 这个题目我AC之后看了一下别人的题解,基本上都是线段树,不过二分也可以. 这个题目很自然就肯定要对其中一个进行排序,排完序之后再处理另外一边,另一边记得离散化. 怎么处理呢,你仔细想 ...
- 牛客小白月赛65ABCD(E)
比赛链接:牛客小白月赛65_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ (nowcoder.com) A:牛牛去购物 题意 ...
- 牛客网 牛客小白月赛5 I.区间 (interval)-线段树 or 差分数组?
牛客小白月赛5 I.区间 (interval) 休闲的时候写的,但是写的心情有点挫,都是完全版线段树,我的一个队友直接就水过去了,为啥我的就超内存呢??? 试了一晚上,找出来了,多初始化了add标记数 ...
- 牛客小白月赛8 - E - 诡异数字 数位DP
牛客小白月赛8 - E - 诡异数字 题意: 求区间中,满足限制条件的数字的个数. 限制条件就是某些数字不能连续出现几次. 思路: 比较裸的数位DP, DP数组开一个dp[len][x][cnt] 表 ...
- 牛客小白月赛18 Forsaken给学生分组
牛客小白月赛18 Forsaken给学生分组 Forsaken给学生分组 链接:https://ac.nowcoder.com/acm/contest/1221/C来源:牛客网 Forsaken有 ...
随机推荐
- 手机端调试工具vConsole
vConsole 一个轻量.可拓展.针对手机网页的前端开发者调试面板. vConsole 是框架无关的,可以在 Vue.React 或其他任何框架中使用. 现在 vConsole 是微信小程序的官方调 ...
- 音视频八股文(6)-- ffmpeg大体介绍和内存模型
播放器框架 常用音视频术语 • 容器/文件(Conainer/File):即特定格式的多媒体文件, 比如mp4.flv.mkv等. • 媒体流(Stream):表示时间轴上的一段连续数据,如一 段声音 ...
- redis内存突然暴增,排查思路是什么
1 这种暴增的应该还是上次一个群友说的,更多可能是外部因素导致的,应用新上线,定时任务这些,再有就是cat上查是哪些指令多,以及比对和之前的时间的差异 看是否有定时任务 或者 新上线的活动 ,在看下监 ...
- 2022-06-30:以下golang代码输出什么?A:0;B:2;C:运行错误。 package main import “fmt“ func main() { ints := make
2022-06-30:以下golang代码输出什么?A:0:B:2:C:运行错误. package main import "fmt" func main() { ints := ...
- es笔记五之term-level的查询操作
本文首发于公众号:Hunter后端 原文链接:es笔记五之term-level的查询操作 官方文档上写的是 term-level queries,表义为基于准确值的对文档的查询,可以理解为对 keyw ...
- nginx发布vue 项目
在本次使用nginx发布vue项目遇到 配置location 始终404 和 在项目子目录点击浏览器刷新出现404问题 使用nginx发布vue项目,为了方便测试就下载了一个nginx 放置自己目录下 ...
- 小程序 Page "pages/posts/post-detail/post-detail" has not been registered yet.
今使用wx.navigateTo进行页面跳转老是提示Page "pages/posts/post-detail/post-detail" has not been register ...
- 二进制部署k8s集群
部署k8s有多种方式,本章我们采取二进制的部署方式来部署k8s集群,二进制部署麻烦点,但是可以在我们通过部署各个组件的时候,也通知能让我们更好的深入了解组件之间的关联,也利于后期维护 主机环境 系统: ...
- Outlook无法启动一直显示“正在启动”的解决方法
缘起 今天早上打开电脑以后,就打开Outlook2016了,一直显示这个界面: 我没在意就干别的事了, 可以半个小时过去了,还是这个界面,我慌了. 解决方法 安全模式打开Outlook 按WIN + ...
- Intellij IDEA最新激活码,适合2022,2023和所有版本,永久更新
分享一下 IntelliJ IDEA 2023.1 最新激活注册码,破解教程如下,可免费永久激活,亲测有效,下面是详细文档哦~ 申明:本教程 IntelliJ IDEA 破解补丁.激活码均收集于网络, ...