「CodeM」排列
传送门
Description
给 \(n\) 个二维点 \((a_i,b_i)\),询问有多少种排列 \(p\)(答案对 \(10^9+7\) 取模)使得执行以下伪代码后留下的点是 \(i\),即最后 \(\text{saved} = i\)。
saved = p[1]
for x from 2 to n
if a[p[x]] >= a[saved] and b[p[x]] >= b[saved]
saved = p[x]
保证 \(a\) 和 \(b\) 分别为一个排列。
Solution
对于一个点,如果不存在两维都比他大的点,那么它有解
考虑\(saved\)总共存储过的值,设为\(A_1,...,A_k\)
那么,在所有横纵坐标都比\(A_i\)的大的点中,\(A_{i+1}\)一定是最早出现的
设\(num[i]\)表示有\(num[i]\)个点一定不能排在\(i\)之前(\(i\)自己也算),特别的\(num[p_1]=n\)
所以这样的排列(指依次停留在\(A_1,...,A_k\))会有\(\frac{n!}{\prod_{i=1}^k num[A_i]}\)
简化为\(\frac{(n-1)!}{\prod_{i=1}^{k-1}b[A_i]}\),\(b[i]\)表示横纵坐标都比\(i\)号点大的点的个数
可以\(dp\)求解,需要做个二维求和,可以先对一维排序,第二维用树状数组维护即可
Code
#include<bits/stdc++.h>
#define ll long long
#define dbg1(x) cerr<<#x<<"="<<(x)<<" "
#define dbg2(x) cerr<<#x<<"="<<(x)<<"\n"
#define dbg3(x) cerr<<#x<<"\n"
using namespace std;
#define reg register
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
const int MN=1e5+5,P=1e9+7;
int Mul(int x,int y){return (1ll*x*y)%P;}
int Add(int x,int y){return (x+y)%P;}
int N,inv[MN];
struct d{int x,y,id;}a[MN];
int T[MN],b[MN],ans[MN];
void C(int x,int y){for(;x<=N;x+=(x&-x))T[x]=Add(T[x],y);}
int G(int x){int r=0;for(;x;x-=(x&-x))r=Add(r,T[x]);return r;}
bool cmp(d x,d y){return (x.x!=y.x)?(x.x<y.x):(x.y<y.y);}
int main()
{
N=read();reg int i;
for(inv[0]=inv[1]=1,i=2;i<=N;++i)inv[i]=Mul(inv[P%i],(P-P/i));
for(i=1;i<=N;++i)a[i].x=read(),a[i].y=read(),a[i].id=i;
std::sort(a+1,a+N+1,cmp);
for(i=N;i;--i)b[i]=N-i-G(a[i].y),C(a[i].y,1);
memset(T,0,sizeof T);C(1,1);
for(i=1;i<=N;++i)
{
int V=G(a[i].y);
if(b[i])C(a[i].y,Mul(V,inv[b[i]]));
else ans[a[i].id]=V;
}
int fac=1;for(i=1;i<N;++i)fac=Mul(fac,i);
for(i=1;i<=N;++i)printf("%d\n",Mul(fac,ans[i]));
return 0;
}
Blog来自PaperCloud,未经允许,请勿转载,TKS!
「CodeM」排列的更多相关文章
- LuoguP7714 「EZEC-10」排列排序 题解
Content 给定一个 \(1\sim n\) 的一个排列 \(p\),你每次可以选择一个区间 \([l,r]\) 并花费 \(r-l+1\) 的代价将下标在这个区间内的所有数升序排序,求使得排列 ...
- LOJ 3175. 「IOI2019」排列鞋子
传送门 考虑如果能确定每个鞋子最终交换到的位置,那么答案容易算出 具体地,如果原位置为 $i$ 的鞋子要交换到 $pos[i]$ 那么最终答案就是 $pos$ 的逆序对数量 如果不懂可以先去写 NOI ...
- loj #2509. 「AHOI / HNOI2018」排列
#2509. 「AHOI / HNOI2018」排列 题目描述 给定 nnn 个整数 a1,a2,…,an(0≤ai≤n),以及 nnn 个整数 w1,w2,…,wn.称 a1,a2,…,an 的 ...
- 「题解」「美团 CodeM 资格赛」跳格子
目录 「题解」「美团 CodeM 资格赛」跳格子 题目描述 考场思路 思路分析及正解代码 「题解」「美团 CodeM 资格赛」跳格子 今天真的考自闭了... \(T1\) 花了 \(2h\) 都没有搞 ...
- 「状压DP」「暴力搜索」排列perm
「状压DP」「暴力搜索」排列 题目描述: 题目描述 给一个数字串 s 和正整数 d, 统计 sss 有多少种不同的排列能被 d 整除(可以有前导 0).例如 123434 有 90 种排列能被 2 整 ...
- 「CTSC 2011」排列
「CTSC 2011」排列 要求不存在公差为 A 或者公比为 B 的子列,那么实际上可以把该问题转化为求一个图的最优拓朴序. 任意差为 A 或者比为 B 的两个数连一条边. 求一个合法序列的答案可以用 ...
- 「ZJOI2016」解题报告
「ZJOI2016」解题报告 我大浙的省选题真是超级神仙--这套已经算是比较可做的了. 「ZJOI2016」旅行者 神仙分治题. 对于一个矩形,每次我们从最长边切开,最短边不会超过 \(\sqrt{n ...
- LOJ 2664. 「NOI2013」向量内积 解题报告
#2664. 「NOI2013」向量内积 两个 \(d\) 维向量 \(A=[a_1, a_2 ,...,a_d]\) 与 \(B=[b_1 ,b_2 ,...,b_d]\) 的内积为其相对应维度的权 ...
- 「UOJ351」新年的叶子
「UOJ351」新年的叶子 题目描述 有一棵大小为 \(n\) 的树,每次随机将一个叶子染黑,可以重复染,问期望染多少次后树的直径会缩小. \(1 \leq n \leq 5 \times 10^5\ ...
随机推荐
- 第十九节:Asp.Net Core WebApi基础总结和请求方式
一. 基础总结 1.Restful服务改造 Core下的WebApi默认也是Restful格式服务,即通过请求方式(Get,post,put,delete)来区分请求哪个方法,请求的URL中不需要写方 ...
- mask-rcnn解读(一):clip_boxes_graph
此部分为mask-rcnn中clip_boxes_graph()函数的使用.首先利用代码解决基本函数的使用,然后运行代码,其细节如下:代码如下: import tensorflow as tfimpo ...
- idea万能快捷键,不可不知的17个实用技巧
说明 IDEA里有一个万能快捷键(alt enter),功能非常强大,同一个快捷键,可以根据不同的语境提示你不同的操作,很多人可能还不了解这些功能,在处理代码的时候还手动处理,了解这些技巧之后,你编码 ...
- leetcode之有效的括号(20)
题目: 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合. 左括号必须以正确的顺序闭合. 注意空字符 ...
- 堆叠降噪自编码器SDAE
https://blog.csdn.net/satlihui/article/details/81006906 https://blog.csdn.net/github_39611196/articl ...
- intellij idea 2019 右键包新建文件是没有java Class选项
今天要测试一个技术点于是新建了一个springboot工程, 在新建文件的时候发现右键后java class文件选项不见了. 以前真的没有碰到这种问题, 感觉很是意外于是百度Google后找到了解决办 ...
- eclipse自定义自动补全语句
1. Windows-->preferences 2. 弹出框选择, Java-->Editor-->Templates-->New 3. 弹出框输入, 1.Name--名字, ...
- Linux上搭建SVN服务
环境:centos7 一.搭建svn服务 1. 安装svn yum -y install subversion 2. 创建一个目录作为svn服务的地址(svn://192.168.0.2:3690 访 ...
- django使用pycharm目录打开不正确导致的问题
1.在目录D:\software\pycharmpython\djangoProject下新建helloworld的项目:django-admin startproject helloworld 2. ...
- 《always run团队》第六次作业:团队项目系统设计改进与详细设计
项目 内容 这个作业属于哪个课程 老师链接 这个作业的要求在哪里 作业链接地址 团队名称 always run 作业学习目标 掌握面向对象软件设计方法:(2)完善系统设计说明书,掌握面向对象详细设计内 ...