题目
题意:给定两个数组s,ts,ts,t,现重排列数组sss,使得数组sss小于ttt。问有多少种排列方式。

参考
代码源自cwxzh

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod=998244353;
ll n,m,a[202020],cnt,p[202020],ans,fac[202020],inv[202020],s[202020],invfac[202020];// 树状数组
ll lowbit(ll aa){return aa&-aa;
}
void add(ll pos,ll x){for(ll i=pos;i<=cnt;i+=lowbit(i)) s[i]+=x;
}
ll query(ll x){ll res=0;for(int i=x;i>0;i-=lowbit(i)) res+=s[i];return res;
}int main(){cin>>n>>m;for(int i=1;i<=n;i++){int x;cin>>x;p[x]++;cnt=max(cnt,(ll)x);}for(int i=1;i<=m;i++) cin>>a[i];fac[0]=fac[1]=inv[0]=inv[1]=invfac[0]=invfac[1]=1;for(int i=2;i<=max(m,n);i++){fac[i]=fac[i-1]*i%mod;// fac[i] = i! inv[i]=(mod-mod/i)*inv[mod%i]%mod;// inv[i] = 1/iinvfac[i]=invfac[i-1]*inv[i]%mod;// invfac[i] = 1/i!}// cntt = C(n,p[1]) * C(n-p[1],p[2]) * ... * C(n-p[1]...-p[cnt-1],p[cnt]) // 即数列的总个数 cntt = P(p[1],p[2],...,p[cnt])int cntt=fac[n];for(int i=1;i<=cnt;i++) cntt=cntt*invfac[p[i]]%mod,add(i,p[i]);for(int i=1;i<=min(n,m);i++){// 贡献:当前数列总个数 * (可取元素个数/剩余元素个数) ans+=query(a[i]-1)*cntt%mod*inv[n-i+1]%mod,ans%=mod;// 没有可更新元素,停止迭代计算 if(p[a[i]]==0) break;// 更新下个迭代的数列总个数 cntt=cntt*inv[n-i+1]%mod*p[a[i]]%mod;// 更新下个迭代的未使用元素数量 p[a[i]]--;add(a[i],-1);// n<m时,如果i能走到n,则额外计算1的贡献 if(n<m&&i==n) ans=(ans+1)%mod;}cout<<ans;return 0;
}

Tyler and Strings(树状数组/排列组合/dp)相关推荐

  1. LIS最长上升子序列详解(动态规划、贪心+二分、树状数组)

    1.摘要: 关于LIS部分,本篇博客讲一下LIS的概念定义和理解,以及求LIS的三种方法,分别是O(n^2)的DP,O(nlogn)的二分+贪心法,以及O(nlogn)的树状数组优化的DP,最后附上几 ...

  2. E. Tyler and Strings(组合计数 + 树状数组/线段树)(带重复元素的全排列)

    题目链接 主要思路还是比较好想的,一些细节公式预处理比较难搞- 参考题解 分析 从前往后遍历,如果s[]剩下的数中,s[i] < t[i]则对答案是有贡献的: 贡献就是后面位置[i+1 ~ n] ...

  3. C. Tyler and Strings(组合数学,树状数组维护前缀和)(Codeforces Round #775 (Div. 1, based on Moscow Open Olympiad i)

    对我来说比较困难的一题了,尝试着自己写了一下,调不出来遂放弃. Codeforces Round #775 (Div. 1, based on Moscow Open Olympiad in Info ...

  4. Equalizing Two Strings 冒泡排序or树状数组

    首先考虑排序后相等 如果排序后相等的话就只考虑reverse长度为2的,所以a或者b排序后存在相邻两个字母相等的话就puts YES,n>26也直接puts YES 不然的话就假设c为a,b排完 ...

  5. Codeforces数学1600----day1[同余定理,树状数组+两次二分,,组合计数]

    1.C. Kuroni and Impossible Calculation **知识点:同余定理 ** #include <iostream> #include <cstdio&g ...

  6. 线。段。树--树状数组-主席树

    简单了解一下线段树 以前写过的内容,搬运过来 线段树的应用场景:满足区间加法性质且多次查询,什么是区间加法性质,比如最大值,求和,树状数组.线段树.主席树依次. 线段树框架:建树--查询--更新... ...

  7. 树状数组(求子区间和+更新元素值)

    树状数组 欲完成修改值和查询区间和两种操作 求前缀和的做法时间复杂度为O(n)O(n)O(n) 使用树状数组时间复杂度降为O(logn)O(logn)O(logn) lowbit 1.x&(- ...

  8. AcWing 241 楼兰图腾(树状数组详解)

    树状数组 问题引入 树状数组是一种实现起来比较简单的高级数据结构. 我们知道,对于一个数组a[i],其前缀和s[i]表示a数组里面前i个元素之和,而求区间l到r的元素之和可以用s[r] - s[l-1 ...

  9. poj2352(树状数组)

    题目链接:https://vjudge.net/problem/POJ-2352 题意:在直角坐标系中给出n个点的 (x,y),(0<=x,y<=32000),定义每个点的level为(x ...

最新文章

  1. Rokid webhook 指南 手把手教你做个懒人
  2. Linux进程的创建函数fork()及其fork内核实现解析
  3. Neko Performs Cat Furrier Transform
  4. 在Tomcat下JSP、Servlet和JavaBean环境的配置
  5. ios 百度地图指定区域_ios百度地图的使用(普通定位、反地理编码)
  6. Java中的观察者设计模式
  7. 颜色空间缩减color space reduction
  8. 20. 有效的括号 golang(2)
  9. 【C语言】单链表的相关热点面试题(包括:从尾到头打印,逆置,冒泡,寻找中间节点,倒数k节点)
  10. shell 多个引号冲突_Html多个引号重叠使用冲突解决办法
  11. centos7查看当前端口_「Centos7开放及查看端口」- 海风纷飞Blog
  12. 限制文本输入框只能输入0-9数字
  13. 01背包 hihocoder第六周
  14. 所有浏览器的 CSS selectors 兼容性
  15. 手游修改 wpe封包 fiddler抓包 逆向破解 gg修改 哪种最厉害?
  16. Xmind模板文档分享——学习记录(4)
  17. IDM chrome插件找不到
  18. iconfont-阿里巴巴矢量图标库在layui中的使用
  19. ssh+dwr实现级联操作
  20. 180420 逆向-DDCTF_WP(Re)

热门文章

  1. FPGA_DS18B20温度传感器手册介绍以及接口代码编写思路
  2. android8 评测,平台化成趋势 UC浏览器安卓8.0版首发评测
  3. ChatGPT 速通手册——开源社区的进展
  4. 微信图标现在可以换颜色了???
  5. 如何让掘金的头像变成gif动图
  6. 怎样制作FL Studio步进音序器中的节奏
  7. 弹性盒模型的实际应用
  8. 曲线弧长和旋转体侧面积的计算公式
  9. 嵌入式linux usb wifi移植[s3c6410平台原创]
  10. 捷径系统:捷径重新定义健身房管理系统