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的更多相关文章

  1. Codeforces Round #285 (Div.1 B & Div.2 D) Misha and Permutations Summation --二分+树状数组

    题意:给出两个排列,求出每个排列在全排列的排行,相加,模上n!(全排列个数)得出一个数k,求出排行为k的排列. 解法:首先要得出定位方法,即知道某个排列是第几个排列.比如 (0, 1, 2), (0, ...

  2. [Codeforces 501D] - Misha and Permutations Summation

    题意是给你两个长度为$n$的排列,他们分别是$n$的第$a$个和第$b$个全排列.输出$n$的第$\left(a+b \right)\textrm{mod} \, n!$个全排列. 一种很容易的想法是 ...

  3. Codeforces Round #285 (Div. 1) B - Misha and Permutations Summation 康拓展开+平衡树

    思路:很裸的康拓展开.. 我的平衡树居然跑的比树状数组+二分还慢.. #include<bits/stdc++.h> #define LL long long #define fi fir ...

  4. CF501D Misha and Permutations Summation(康托展开)

    将一个排列映射到一个数的方法就叫做康托展开.它的具体做法是这样的,对于一个给定的排列{ai}(i=1,2,3...n),对于每个ai求有多少个aj,使得j>i且ai>aj,简单来说就是求a ...

  5. 【codeforces 501D】Misha and Permutations Summation

    [题目链接]:http://codeforces.com/problemset/problem/501/D [题意] 给你两个排列; 求出它们的字典序num1和num2; 然后让你求出第(num1+n ...

  6. CF数据结构练习

    1. CF 438D The Child and Sequence 大意: n元素序列, m个操作: 1,询问区间和. 2,区间对m取模. 3,单点修改 维护最大值, 取模时暴力对所有>m的数取 ...

  7. Permutations II

    Given a collection of numbers that might contain duplicates, return all possible unique permutations ...

  8. [LeetCode] Permutations II 全排列之二

    Given a collection of numbers that might contain duplicates, return all possible unique permutations ...

  9. [LeetCode] Permutations 全排列

    Given a collection of numbers, return all possible permutations. For example,[1,2,3] have the follow ...

随机推荐

  1. 初步了解autoencoder

    初步了解autoencoder 学习自莫烦python 什么是autoencoder? 自编码(autoencoder)是一种神经网络的形式. 例子:一张图片->对其进行打码->最后再将其 ...

  2. AWS In Action

    Core Services of AWS Elastic Cloud Compute(EC2) Simple Storage Service(S3) Relational Database Servi ...

  3. [转载]java匿名对象

    来源:https://blog.csdn.net/qiaoquan3/article/details/53300248 匿名对象:没有名字的对象:new Car();  //匿名对象其实就是定义对象的 ...

  4. O010、动手实践虚拟网络

    参考https://www.cnblogs.com/CloudMan6/p/5296573.html   本节将演示如何在实验环境中实现下图所示的虚拟网络  

  5. centos安装配置LAMP,https,fastcgi

    Centos7 配置LAMP+fastcgi(Centos7.2+php7.0+mariadb+httpd)   环境:阿里云centos7.3 一.安装并配置数据库 1.安装数据库 #yum ins ...

  6. 18 Python之初识面向对象

    1. 类与对象 class Car: #类名首字母大写,严格遵守驼峰命名规范 pass #造车 c = Car() #类名() #创建对象 ##出场之后进行改装 c.color = "红色& ...

  7. Vue中,过滤器的使用方法!

    Vue.js允许自定义过滤器,可被用于一些常见的文本格式化.过滤器可以用在两个地方:双花括号插值和v-bind表达式.过滤器应该被添加在JavaScript表达式的尾部,由“管道”符号指示:(借官方的 ...

  8. linux进程调度的算法

    linux进程的调度算法 这节我们来学习一下linux进程的优先级 linux进程的优先级 进程提供了两种优先级,一种是普通的进程优先级,第二个是实时优先级,前者使用SCHEED_NORMAL调度策略 ...

  9. python分别获取虚拟网卡和真实网卡ip

    #!/usr/bin/python # -*- coding: utf-8 -*- import commands import socket import fcntl import struct C ...

  10. liunx和aix 系统开启ftp服务

    AIX开启ftp服务: 1.ftp服务的守护进程是否存在 #lssrc -s inetd 2.ftp服务的开启与关闭 #startsrc -t ftp #stopsrc -t ftp 3.ftp服务是 ...