传送门

文章目录

  • 题意:
  • 思路:

题意:

思路:

首先肯定不能模n!n!n!,所以考虑先将a,ba,ba,b做一个逆康托展开,得到a′,b′a',b'a′,b′数组,以及a′+b′=suma'+b'=suma′+b′=sum数组,让后我们可以通过这个数组每个位置乘上权(n−i)!(n-i)!(n−i)!得到他的字典序排名,也就是需要模n!n!n!的数,考虑从低位向前递推,也就是sum[i−1]+=sum[i]mod(n−i+1),sum[i]=sum[i]mod(n−i+1)sum[i-1]+=sum[i]\bmod (n-i+1),sum[i]=sum[i]\bmod (n-i+1)sum[i−1]+=sum[i]mod(n−i+1),sum[i]=sum[i]mod(n−i+1)即可,最后再将其逆回来即可。

// Problem: D. Misha and Permutations Summation
// Contest: Codeforces - Codeforces Round #285 (Div. 2)
// URL: https://codeforces.com/problemset/problem/501/D
// Memory Limit: 256 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#include<random>
#include<cassert>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid ((tr[u].l+tr[u].r)>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=1000010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n;
int a[N],b[N];
LL fun[N];
struct Node {int l,r;int cnt;
}tr[N<<2];void pushup(int u) {tr[u].cnt=tr[L].cnt+tr[R].cnt;
}void build(int u,int l,int r) {tr[u]={l,r};if(l==r) {tr[u].cnt=1;return;}build(L,l,Mid); build(R,Mid+1,r);pushup(u);
}void change(int u,int pos) {if(tr[u].l==tr[u].r) {tr[u].cnt=0;return;}if(pos<=Mid) change(L,pos);else change(R,pos);pushup(u);
}int query1(int u,int l,int r) {if(tr[u].l>=l&&tr[u].r<=r) return tr[u].cnt;int ans=0;if(l<=Mid) ans+=query1(L,l,r);if(r>Mid) ans+=query1(R,l,r);return ans;
}int query2(int u,int cnt) {if(tr[u].l==tr[u].r) return tr[u].l;if(tr[L].cnt>cnt) return query2(L,cnt);else return query2(R,cnt-tr[L].cnt);
}int main()
{//  ios::sync_with_stdio(false);
//  cin.tie(0); scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&a[i]),a[i]++;for(int i=1;i<=n;i++) scanf("%d",&b[i]),b[i]++;build(1,1,n);for(int i=1;i<=n;i++) {int cnt=query1(1,1,a[i]-1);change(1,a[i]);a[i]=cnt;}build(1,1,n);for(int i=1;i<=n;i++) {int cnt=query1(1,1,b[i]-1);change(1,b[i]);b[i]=cnt;}for(int i=n;i>=1;i--) {a[i]+=b[i];int t=a[i]/(n-i+1);a[i-1]+=t;a[i]%=(n-i+1);}build(1,1,n);for(int i=1;i<=n;i++) {int pos=query2(1,a[i]);change(1,pos);printf("%d%c",pos-1,i==n? '\n':' ');}    return 0;
}
/**/

Codeforces Round #285 (Div. 2) D. Misha and Permutations Summation 康托展开 + 线段树相关推荐

  1. Codeforces 504 A (Round #285 div.1 A) Misha and Forest

    Codeforces Round #285 (Div.1) A Misha and Forest 水题水题水-- 题意:给你一些点,给出他们连通了多少个点以及这些点的下标的异或值,让你找出一个图 题解 ...

  2. Codeforces Round #815 (Div. 2)

    Codeforces Round #815 (Div. 2) 传送门 :Codeforces Round #815 (Div. 2) 之前都是108键的键盘,最近在家用的68,两三天了还是非常不顺手, ...

  3. Educational Codeforces Round 112(Div.2) ABC题解

    D题好像可以做一做,挖个坑以后做好了来填(doge Educational Codeforces Round 112(Div.2) 题目列表 1.A 2.B 3.C 1.A 原题链接 题目大意 有三种 ...

  4. Codeforces Round #506 (Div. 3)

    Codeforces Round #506 (Div. 3) 实习期间事不多,对div3 面向题解和数据编程了一波 A. Many Equal Substrings 题目链接 A题就是找后缀和前缀重合 ...

  5. Codeforces Round #563 (Div. 2)/CF1174

    Codeforces Round #563 (Div. 2)/CF1174 CF1174A Ehab Fails to Be Thanos 其实就是要\(\sum\limits_{i=1}^n a_i ...

  6. 构造 Codeforces Round #302 (Div. 2) B Sea and Islands

    题目传送门 1 /* 2 题意:在n^n的海洋里是否有k块陆地 3 构造算法:按奇偶性来判断,k小于等于所有点数的一半,交叉输出L/S 4 输出完k个L后,之后全部输出S:) 5 5 10 的例子可以 ...

  7. Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解(每日训练 Day.16 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解 比赛链接:h ...

  8. Codeforces Round #712 Div.2(A ~ F) 超高质量题解(每日训练 Day.15 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #712 Div.2(A ~ F) 题解 比赛链接:https:// ...

  9. Codeforces Round #701 (Div. 2) A ~ F ,6题全,超高质量良心题解【每日亿题】2021/2/13

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A - Add and Divide B - Replace and Keep Sorted C ...

最新文章

  1. 武汉科技大学ACM:1002: 华科版C语言程序设计教程(第二版)例题6.6
  2. 360全景html插件,jquery实现360度全景展示特效插件
  3. anaconda程序组中的各个组件都是做什么用的
  4. Linux缓冲区溢出问题
  5. win 10无法启动print spooler服务,提示1068依赖服务或组无法启动
  6. JSP由浅入深(3)—— 通过表达式增加动态内容
  7. Uipath 学习栏目基础教学:7、uipath 用open browser实现打开网页并登录
  8. JAVA中string的赋值_Java中关于String赋值的两种形式
  9. Firefox删除DNS缓存——修改hosts后,无需关闭
  10. 星期四星期五,越学越难
  11. 常见的主流数据库(DBMS)
  12. 机器学习中的泛化误差
  13. vim 日常使用高级篇幅
  14. 在网页右下角添加一个卡通动漫人物
  15. 细致的网站开发流程是怎样的?
  16. ssm实现用户登录功能拦截
  17. 鱼和熊掌兼得!这些应用是如何使用 Material Design 的?
  18. 方舟建立服务器显示cmd,家庭电脑建方舟服务器
  19. 10分钟搞定Java带token验证的注册登录
  20. MFC 高速绘图坐标轴内添加纵向基准线的方法

热门文章

  1. drawable文件怎么添加图片_怎么给PDF文件添加书签
  2. 实验 6 场景创建与执行 实验报告--软件功能测试与性能测试实验
  3. 人造流星这种生日礼物,你有过吗?现在国外有了
  4. 如何使用TensorFlow玩转深度学习?
  5. 利用11行Python代码,盗取了室友的U盘,内容十分刺激!
  6. 【干货】人人都能看懂的LSTM
  7. AI浪潮席卷而来,现在加入还来得及吗?
  8. 锁屏快捷键_全面屏 iPhone 锁屏快捷键美化,让你的 iPhone 更特别
  9. 如何用matlab消除谐波,如何在含有整次谐波和非整次谐波的信号中去除整次谐波?...
  10. c语言程序stm8s,stm8s的c语言编程例程