【题目链接】:http://codeforces.com/problemset/problem/501/D

【题意】



给你两个排列;

求出它们的字典序num1和num2;

然后让你求出第(num1+num2)%n!个排列是什么;

(字典序);

【题解】



首先。

求出两个排列的字典序;

->康拓展开搞出来;

然后得到

v1[1]∗(n−1)!+..+v1[i]∗(n−i)!+...+v1[n]∗(0)!

的形式

这里v1[i]是i+1..n中比a[i]小的数的个数;

同样的能够得到

v2[1]∗(n−1)!+..+v2[i]∗(n−i)!+...+v2[n]∗(0)!

这里v2[i]是i+1..n中比b[i]小的数的个数;

然后考虑把两个数加起来;

即合并成

(v1[1]+v2[1])∗(n−1)!+..+(v1[i]+v2[i])∗(n−i)!+...+(v1[n]+v2[n])∗(0)!

这里合并之后(v1[i]+v2[i])的值不一定会比(n-i)小;

这就可能让某一个v1[i]+v2[i]进到前一位去;

比如(3+3)4!进到x*5!去;

就会让x加1

因为(3+3)*4!可以写成(5+1)*4!的形式;

即5!+1*4!

也即让5!的系数+1了;

然后4!的系数会减去5

一直往前进位就好;

别忘了要%n!

所以n!的系数可以不用管它了;

然后就能得到(num1+num2)%n!

这个排列的康拓展开的各个

v值了;

从第1位开始;

根据v[1],可以得到比a[1]小的数有多少个;

然后直接让他等于那个v[1]+1;

然后考虑v[2];

这个时候仍旧能够直接得到比a[2]小的数有多少个;

但是不能再包括a[1]了,因为是从2+1..n这个范围里面找比a[2]小的数的个数;

根据找到的合适的位置,确定a[2]即可

以此类推获得a[n]

(可以用树状数组+二分搞出来)

掌握了康拓展开、逆康拓展开吧..

还是很优秀的。



【Number Of WA】



0



【完整代码】

#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ms(x,y) memset(x,y,sizeof x)
#define Open() freopen("F:\\rush.txt","r",stdin)
#define Close() ios::sync_with_stdio(0),cin.tie(0) typedef pair<int,int> pii;
typedef pair<LL,LL> pll; const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int N = 2e5+100; int n; struct BIT
{
int data[N];
int lowbit(int x){
return (-x)&x;
}
int get_sum(int x){
int sum = 0;
while (x > 0){
sum+=data[x];
x-=lowbit(x);
}
return sum;
}
void add(int x,int y)
{
while (x<=n){
data[x]+=y;
x+=lowbit(x);
}
}
void init()
{
ms(data,0);
}
}; BIT c;
int a[N],b[N],v[N],ans[N]; void kangtuo(int *a,BIT &bit){
bit.init();
rep1(i,1,n){
int s = a[i]-1-bit.get_sum(a[i]-1);
bit.add(a[i],1);
v[i]+=s;
}
} int Bsearch(int l,int r,int k)
{
int ans = 0;
while (l <= r)
{
int mid = (l+r)>>1;
int temp = c.get_sum(mid);
if (mid-temp>=k){
ans = mid;
r = mid-1;
}
else
l = mid+1;
}
return ans;
} void nikangtuo(BIT &bit){
bit.init();
rep1(i,1,n){
int s = Bsearch(1,n,v[i]+1);
ans[i] = s;
c.add(s,1);
}
} int main(){
//Open();
Close();//scanf,puts,printf not use
//init??????
cin >> n;
rep1(i,1,n)
cin>>a[i],a[i]++;
rep1(i,1,n)
cin>>b[i],b[i]++;
kangtuo(a,c);
kangtuo(b,c);
rep2(i,n,1){
int you = n-i+1;
v[i-1]+=v[i]/you;
v[i]%=you;
}
nikangtuo(c);
rep1(i,1,n)
{
cout<<ans[i]-1<<(i==n?'\n':' ');
}
return 0;
}

【codeforces 501D】Misha and Permutations Summation的更多相关文章

  1. 【CodeForces - 501B 】Misha and Changing Handles(map)

    Misha and Changing Handles CodeForces原题是英文,这里就直接上中文好了,翻译不是太给力,但是不影响做题 ^▽^ Description  神秘的三角洲里还有一个传说 ...

  2. 【Codeforces 501C】Misha and Forest

    [链接] 我是链接,点我呀:) [题意] 给你一棵树 但是每个节点只告诉你出度个数 以及所有和它相连的点的异或和. 让你还原这棵树 [题解] 叶子节点的话,他所有节点的异或和就是它那唯一的一个爸爸 因 ...

  3. 【Codeforces 986B】Petr and Permutations

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] n为奇数时3n和7n+1奇偶性不同 n为偶数时也是如此 然后交换任意一对数 逆序对的对数的奇偶性会发生改变一次 求出逆序对 对n讨论得出答案. ...

  4. 【CodeForces 504A】Misha and Forest

    题 题意 有n个点,代号分别为0到n-1,然后这n个点有d个相连点,相连点的XOR sum 为s,求所有的边. 分析 知识:a^b^a=b,a^b^b=a. 把相连点为1的i存进队列,i的唯一相连点就 ...

  5. 【codeforces 415D】Mashmokh and ACM(普通dp)

    [codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...

  6. Misha and Permutations Summation

    A - Misha and Permutations Summation 首先这个 mod n! 因为数量级上的差别最多只会对康拓展开的第一项起作用所以这个题并不需要把 ord (p) 和 ord ( ...

  7. 【codeforces 602E】Kleofáš and the n-thlon

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  8. 【25.00%】【codeforces 584E】Anton and Ira

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  9. 【codeforces 707E】Garlands

    [题目链接]:http://codeforces.com/contest/707/problem/E [题意] 给你一个n*m的方阵; 里面有k个联通块; 这k个联通块,每个连通块里面都是灯; 给你q ...

随机推荐

  1. 做支付遇到的HttpClient大坑

    前言 HTTPClient大家应该都很熟悉,一个很好的抓网页,刷投票或者刷浏览量的工具.但是还有一项非常重要的功能就是外部接口调用,比如说发起微信支付,支付宝退款接口调用等:最近我们在这个工具上栽了一 ...

  2. Profile 动态切换环境

    一.多 Profile 文件我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml默认使用 application.properties 的 ...

  3. JAVA的基本数据类型和引用数据类型的区别

        引用数据类型: 类.接口类型.数组类型.枚举类型.注解类型:   基本数据类型和引用数据类型的区别: 基本数据类型在被创建时,在栈上给其划分一块内存,将数值直接存储在栈上: 引用数据类型在被创 ...

  4. SQL优化的思路及基本原则(mysql)

    SQL优化的思路:  1.优化更需要优化的sql:  2.定位优化对象的性能瓶颈:优化前需了解查询的瓶颈是IO还是CPU,可通过PROFILING很容易定位查询的瓶颈.  3.明确优化目标:  4.从 ...

  5. 数据库-mongodb-常用命令

    展示当前集合列表 1 show dbs 查看查询命令 1 db.stu.find().explain(); 结果中的 "cursor":"BasicCursor" ...

  6. CF909B Segments

    CF909B Segments 题意翻译 题目描述 给你一个整数N.考虑坐标轴上所有可能的部分,在整数点上的端点,坐标在0到N之间,包括它们. 您希望在几个层中绘制这些片段,这样在每个层中这些片段就不 ...

  7. 怎样使windows上的javaWEB项目公布到Centos上

    首先在windows上把项目导入到myeclipse或者eclipse(JEE)版本号上. 然后经过调试,没有错误后. 点击项目,然后右键导出(Export...) 然后选择JEE的war格式,这个是 ...

  8. 转:IOS远程推送通知

    在ios系统中,app应用程序无法在后台完成较多的任务,仅仅允许程序做一些有限的任务(如音视频播放.地理位置信息.voip).然而,如果你想做 一些有趣的事情,并且告知用户,甚至用户没有使用你的app ...

  9. UVALive 6663 Count the Regions 离散+bfs染色_(:зゝ∠)_

    题目链接:option=com_onlinejudge&Itemid=8&page=show_problem&problem=4675">点击打开链接 gg.. ...

  10. 27.Qt时钟

    myclock.h #ifndef MYCLOCK_H #define MYCLOCK_H #include <QObject> #include <QLCDNumber> # ...