[洛谷U72177]火星人plus
题目大意:给你一个$1\sim n(n\leqslant 10^5)$的排列,设$a$为它在$1\sim n$的全排列中的排名,求在$1\sim n$的全排列中第$a+m$个排列。
题解:康托展开以及逆康托展开。将原排列转为变进制数,加上$m$,再用转回排列。转回去可以用在树状数组上二分来解决。这里使用了$skip2004$教的两种方法。
卡点:变进制数加法时写错
C++ Code:
#include <cstdio>
#include <iostream>
#include <algorithm>
const int maxn = 1 << 17; int n, L = 1, nn; namespace BIT {
int V[maxn], res;
inline void inc(int p) { for (; p <= L; p += p & -p) ++V[p]; }
inline void dec(int p) { for (; p <= L; p += p & -p) --V[p]; }
inline int sum(int p) { for (res = 0; p; p &= p - 1) res += V[p]; return res; }
inline void fill(int p, int L) { for (int i = 0; i < L; ++i) V[i] = p * (i & -i); }
inline int query(int k) { // 树状数组上二分
// 区间法
static int l, r, mid;
l = 1, r = L;
while (l != r) {
mid = l + r >> 1;
if (V[mid] < k) k -= V[mid], l = mid + 1;
else r = mid;
}
dec(l);
return l;
// 跳点法
static int rt; rt = L;
for (int i = rt; i >>= 1; ) {
if (V[rt - i] < k) k -= V[rt - i];
else rt -= i;
}
dec(rt);
return rt;
}
} long long a[maxn], m;
int main() {
std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);
std::cin >> n >> m;
while (L < n) L <<= 1;
for (int i = 1, t; i <= n; ++i) {
std::cin >> a[i];
t = BIT::sum(a[i]);
BIT::inc(a[i]);
a[i] = a[i] - t - 1;
}
a[n] += m;
for (int i = n; i; --i) {
a[i - 1] += a[i] / (n - i + 1);
a[i] %= n - i + 1;
}
BIT::fill(1, L + 1);
for (int i = 1; i <= n; ++i) std::cout << BIT::query(a[i] + 1) << ' ';
std::cout << '\n';
return 0;
}
[洛谷U72177]火星人plus的更多相关文章
- 洛谷P1088 火星人【STL】【思维】
题目:https://www.luogu.org/problemnew/show/P1088 题意: 给定一个n个数的排列,要求得到这之后的第m个排列. 思路: next_permutation的简单 ...
- 洛谷P1088 火星人 [STL]
题目传送门 火星人 格式难调,题面就不放了. 分析: 这道题目不得不又让人感叹,还是$STL$大法好!!! $C++$的$algorithm$库中自带有$next\_permutation()$和$p ...
- 洛谷——P1088 火星人
P1088 火星人 题目描述 人类终于登上了火星的土地并且见到了神秘的火星人.人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法.这种交流方法是这样的,首先,火星人把一个非常 ...
- 洛谷P1088——火星人(全排列+数学模拟)
题目描述 人类终于登上了火星的土地并且见到了神秘的火星人.人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法.这种交流方法是这样的,首先,火星人把一个非常大的数字告诉人类科学 ...
- 洛谷 P1088 火星人
https://www.luogu.org/problemnew/show/P1088 这个题一开始是很蒙的 感觉很麻烦,每次都要交换balabala..... 后来才知道有这么一个神奇的stl 真是 ...
- 洛谷 P1088 火星人 (全排列)
直接调用next_permutation即可,向前的话可以调用prev_permutation #include<cstdio> #include<cctype> #inclu ...
- 洛谷P1088 火星人
//其实就是全排列 //我们从外星人给的那串数字往下搜索 //一直往下拓展m次 //最后输出结果 //虽然看起来很暴力,但是题目上说了m非常小 #include<bits/stdc++.h> ...
- 洛谷试炼场-简单数学问题-P1088 火星人
洛谷试炼场-简单数学问题 A--P1088 火星人 Description 人类终于登上了火星的土地并且见到了神秘的火星人.人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法 ...
- bzoj 1014: 洛谷 P4036: [JSOI2008]火星人
题目传送门:洛谷P4036. 题意简述: 有一个字符串,支持插入字符,修改字符. 每次需要查询两个后缀的LCP长度. 最终字符串长度\(\le 100,\!000\),修改和询问的总个数\(\le 1 ...
随机推荐
- 洛谷 P3884 [JLOI2009]二叉树问题
目录 题目 思路 \(Code\) 题目 P3884 [JLOI2009]二叉树问题 思路 深搜统计深度,倍增\(\text{LCA}\)求边数 \(Code\) #include<iostre ...
- SuperHyperMarket(优先队列+重载)
SuperHyperMarket(优先队列+重载) 具体见代码注释 /* */ #include <iostream> #include <cstring> #include ...
- Spyder汉化问题
首先感谢李增海大神,以下内容来源于http://www.lizenghai.com 必备条件 1.已安装Spyder 2.Spyder版本在3.X以上 Spyder安装: 1.anaconda下,co ...
- sublime 添加到右键菜单
- jmeter待解决55大问题
客户交付一个性能测试项目,阐述实施流程. 解释5个常用的性能指标的名称与具体含义. 写出5个jmeter中常用函数,并对其中2个举例说明用法. 简述jmeter的工作原理? 什么是集合点?设置集合点有 ...
- QML学习(二)——<QML语法>
一.Qml类型 QML类型分为三类:基本类型.QML对象类型以及JavaScript类型 1 基本类型 我们可以再qt帮助文档中搜索基本类型查看 基本类型的概念是相对于QML对象类型而言的,QML 对 ...
- deepin深度学习环境配置
deepin是一个精致优美的系统.最近因为工作需要在deepin上配置深度学习环境,话不多说,接下来记录下整个的配置过程. ×××本篇文章适合对深度学习环境配置有一定了解且对deepin系统感兴趣的同 ...
- Mxnet学习笔记(3)--自定义Op
https://blog.csdn.net/u011765306/article/details/54562282 前言 今天因为要用到tile操作(类似np.tile,将数据沿axises进行数据扩 ...
- SpringBoot项目实现配置实时刷新功能
需求描述:在SpringBoot项目中,一般业务配置都是写死在配置文件中的,如果某个业务配置想修改,就得重启项目.这在生产环境是不被允许的,这就需要通过技术手段做到配置变更后即使生效.下面就来看一下怎 ...
- Python3基础 tuple(list) 改变list元素的内容时,元组的id值不变
Python : 3.7.3 OS : Ubuntu 18.04.2 LTS IDE : pycharm-community-2019.1.3 ...