Misha and Permutations Summation
A - Misha and Permutations Summation
首先这个 mod n! 因为数量级上的差别最多只会对康拓展开的第一项起作用所以这个题并不需要把 ord (p) 和 ord (q) 的具体值算出来,因为最后还需要进行康托逆展开所以用一 个数组来储存对应的值即可然后利用变进制的思想把 s[ ] 数组处理一下即可
变进制处理 s[ ] 数组:
for(int i=n-1;i>=1;--i)
s[i-1]+=s[i]/(n-i+1),s[i]=s[i]%(n-i+1);
代码:
// Created by CAD on 2019/8/10.
#include <bits/stdc++.h>
#define mst(name, value) memset(name,value,sizeof(name))
#define lowbit(x) (x&(-x))
using namespace std;
using pii=pair<int, int>;
using piii=pair<pair<int, int>, int>;
using ll=long long;
const int maxn=2e5+5;
int p[maxn],q[maxn];
int c[maxn],s[maxn];
int num[maxn],n;
void add(int x,int k)
{
while(x<=n)
c[x]+=k,x+=lowbit(x);
}
ll getsum(int x)
{
ll ans=0;
while(x>0)
ans+=c[x],x-=lowbit(x);
return ans;
}
void init()
{
mst(c,0);
for(int i=1;i<=n;++i) add(i,1);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
init();
for(int i=1;i<=n;++i)
{
cin>>p[i],p[i]++;
s[i]+=getsum(p[i]-1);
add(p[i],-1);
}
init();
for(int i=1;i<=n;++i)
{
cin>>q[i],q[i]++;
s[i]+=getsum(q[i]-1);
add(q[i],-1);
}
for(int i=n-1;i>=1;--i)
s[i-1]+=s[i]/(n-i+1),s[i]=s[i]%(n-i+1);
init();
for(int i=1;i<=n;++i)
{
int l=1,r=n,ans;
while(l<=r)
{
int mid=(l+r)>>1;
if(getsum(mid-1)<=s[i])
l=mid+1,ans=mid;
else r=mid-1;
}
num[i]=ans;
add(ans,-1);
}
for(int i=1;i<n;++i) cout<<num[i]-1<<' ';
cout<<num[n]-1<<endl;
return 0;
}
Misha and Permutations Summation的更多相关文章
- Codeforces Round #285 (Div.1 B & Div.2 D) Misha and Permutations Summation --二分+树状数组
题意:给出两个排列,求出每个排列在全排列的排行,相加,模上n!(全排列个数)得出一个数k,求出排行为k的排列. 解法:首先要得出定位方法,即知道某个排列是第几个排列.比如 (0, 1, 2), (0, ...
- [Codeforces 501D] - Misha and Permutations Summation
题意是给你两个长度为$n$的排列,他们分别是$n$的第$a$个和第$b$个全排列.输出$n$的第$\left(a+b \right)\textrm{mod} \, n!$个全排列. 一种很容易的想法是 ...
- Codeforces Round #285 (Div. 1) B - Misha and Permutations Summation 康拓展开+平衡树
思路:很裸的康拓展开.. 我的平衡树居然跑的比树状数组+二分还慢.. #include<bits/stdc++.h> #define LL long long #define fi fir ...
- CF501D Misha and Permutations Summation(康托展开)
将一个排列映射到一个数的方法就叫做康托展开.它的具体做法是这样的,对于一个给定的排列{ai}(i=1,2,3...n),对于每个ai求有多少个aj,使得j>i且ai>aj,简单来说就是求a ...
- 【codeforces 501D】Misha and Permutations Summation
[题目链接]:http://codeforces.com/problemset/problem/501/D [题意] 给你两个排列; 求出它们的字典序num1和num2; 然后让你求出第(num1+n ...
- CF数据结构练习
1. CF 438D The Child and Sequence 大意: n元素序列, m个操作: 1,询问区间和. 2,区间对m取模. 3,单点修改 维护最大值, 取模时暴力对所有>m的数取 ...
- Permutations II
Given a collection of numbers that might contain duplicates, return all possible unique permutations ...
- [LeetCode] Permutations II 全排列之二
Given a collection of numbers that might contain duplicates, return all possible unique permutations ...
- [LeetCode] Permutations 全排列
Given a collection of numbers, return all possible permutations. For example,[1,2,3] have the follow ...
随机推荐
- C++练习 | 单向链表类模板(包含类模板中静态变量初始化格式)
#include <iostream> #include <string> using namespace std; template <class T> clas ...
- Springboot提示数据库连接问题Connection is not available
2019-05-29 11:19:51.824 WARN 854 --- [io-8080-exec-10] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL ...
- Fire Net(HDU-1045)(匈牙利最大匹配)(建图方式)
题意 有一个 n*n 的图,. 代表空白区域,X 代表墙,现在要在空白区域放置结点,要求同一行同一列只能放一个,除非有墙阻隔,问最多能放多少个点 思路 只有在墙的阻隔情况下,才会出现一行/列出现多个点 ...
- leetcode难题
4 寻找两个有序数组的中位数 35.9% 困难 10 正则表达式匹配 24.6% 困难 23 合并K个排序链表 47.4% 困难 25 K ...
- Nginx的快速安装
1. 准备工作 1. CenterOS7.x.vmware虚拟机,安装过程参考 https://jingyan.baidu.com/article/eae0782787b4c01fec548535.h ...
- 一文全面了解NB-IoT技术优势及特点
1.NB-IOT多输入多输出技术 NB-IoT可以利用多天线技术抑制信道传输衰弱,获得分集增益.空间复用增益和阵列增益,在发送端和接收端均采用多天线实现信号同时发送和接收: 因此就形成了一个并行的多空 ...
- linux 静态路由
用ip route删除默认路由 ip route del default via 192.168.18.1 用route删除默认路由route del default gw 192.168.18.1 ...
- uft 测试工具使用
选择 uft 自带小飞机 cs测试 开始设置 启动插件管理 选择测试 软件类型 cs bs 新建录制项目 各个功能按钮 添加测试程序工作路径 进入录制 保存录制 ...
- Java语言基础(6)
1 while循环 案例:Demo1 1+2+3+4+5+...+100 = ? 首先定义一个变量sum,用来保存累加之和,int sum=0 第1次:sum = sum + 1 第2次: sum = ...
- (转)Linux传输大文件(分割传输)
1.分拆为多个文件的命令: cat workspace_2018.tar.gz | split -b 1G - workspace_2018.tar.gz. 命令解释: workspace_2018. ...