「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\ ...
随机推荐
- Redis 内存管理 源码分析
要想了解redis底层的内存管理是如何进行的,直接看源码绝对是一个很好的选择 下面是我添加了详细注释的源码,需要注意的是,为了便于源码分析,我把redis为了弥补平台差异的那部分代码删了,只需要知道有 ...
- NPOI中的PhysicalNumberOfCells 与 LastCellNum
这两个理论上一个是算空列,一个不算空列,但是实际上有时候相同数据的excel,不同的excel编辑工具保存后的,PhysicalNumberOfCells可能不一样,会导致莫名其妙错误,最好使用Las ...
- freemarker中8个常用的指令
这里列举出Freemarker模板文件中8个常用的指令. 1. assign assign指令用于创建或替换一个顶层变量,assign指令的用法有多种,包括创建或替换一个顶层变量,创建或替换多个变量等 ...
- Android项目实现Module目录结构分组
一.背景 项目需求的频繁迭代,新的产品功能在不断添加和延伸,随之带来的是,项目技术复杂度的提升. 近几年来,Android模块化.组件化相关技术得到极速发展,将项目整体进行分层,不同的层次之间依据实际 ...
- jetbrain 公司2019年全套产品的破解方案
百度网盘下载地址是:链接:https://pan.baidu.com/s/1E4E76Oglfexed0iHNiXjEQ 密码:pehx ======================== ...
- Redis(九)高可用专栏之《简介篇》
在互联网的大趋势下,用户体验.服务的可用性日趋重要.任何一个服务的不可用,都可能导致连锁式功能故障. 前言 高可用模型的已经逐渐形成一种套路: 主备/主从模式 集群模式 主备/主从模式 至少有两台服务 ...
- JAVA操作InfluxDB的一个Demo
一.基础连接类 package com.test.repository.utils; import com.dcits.domain.entry.bo.common.InfluxDbRow; impo ...
- Python笔记:装饰器
装饰器 1.特点:装饰器的作用就是为已存在的对象添加额外的功能,特点在于不用改变原先的代码即可扩展功能: 2.使用:装饰器其实也是一个函数,加上@符号后放在另一个函数“头上”就实现了装饰 ...
- Sharding-Jdbc概念与使用技巧
1. Sharding-Jdbc概念与使用技巧 此讲解版本为4.0.0-RC1,目前最新的版本 2019年5月21日发布 1.1. 绑定表 指分片规则一致的主表和子表.例如:t_order表和t_or ...
- maven 学习---Maven本地资源库
Maven的本地资源库是用来存储所有项目的依赖关系(插件jar和其他文件,这些文件被Maven下载)到本地文件夹. 很简单,当你建立一个Maven项目,所有相关文件将被存储在你的Maven本地仓库. ...