传送门

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」排列的更多相关文章

  1. LuoguP7714 「EZEC-10」排列排序 题解

    Content 给定一个 \(1\sim n\) 的一个排列 \(p\),你每次可以选择一个区间 \([l,r]\) 并花费 \(r-l+1\) 的代价将下标在这个区间内的所有数升序排序,求使得排列 ...

  2. LOJ 3175. 「IOI2019」排列鞋子

    传送门 考虑如果能确定每个鞋子最终交换到的位置,那么答案容易算出 具体地,如果原位置为 $i$ 的鞋子要交换到 $pos[i]$ 那么最终答案就是 $pos$ 的逆序对数量 如果不懂可以先去写 NOI ...

  3. loj #2509. 「AHOI / HNOI2018」排列

    #2509. 「AHOI / HNOI2018」排列   题目描述 给定 nnn 个整数 a1,a2,…,an(0≤ai≤n),以及 nnn 个整数 w1,w2,…,wn.称 a1,a2,…,an 的 ...

  4. 「题解」「美团 CodeM 资格赛」跳格子

    目录 「题解」「美团 CodeM 资格赛」跳格子 题目描述 考场思路 思路分析及正解代码 「题解」「美团 CodeM 资格赛」跳格子 今天真的考自闭了... \(T1\) 花了 \(2h\) 都没有搞 ...

  5. 「状压DP」「暴力搜索」排列perm

    「状压DP」「暴力搜索」排列 题目描述: 题目描述 给一个数字串 s 和正整数 d, 统计 sss 有多少种不同的排列能被 d 整除(可以有前导 0).例如 123434 有 90 种排列能被 2 整 ...

  6. 「CTSC 2011」排列

    「CTSC 2011」排列 要求不存在公差为 A 或者公比为 B 的子列,那么实际上可以把该问题转化为求一个图的最优拓朴序. 任意差为 A 或者比为 B 的两个数连一条边. 求一个合法序列的答案可以用 ...

  7. 「ZJOI2016」解题报告

    「ZJOI2016」解题报告 我大浙的省选题真是超级神仙--这套已经算是比较可做的了. 「ZJOI2016」旅行者 神仙分治题. 对于一个矩形,每次我们从最长边切开,最短边不会超过 \(\sqrt{n ...

  8. LOJ 2664. 「NOI2013」向量内积 解题报告

    #2664. 「NOI2013」向量内积 两个 \(d\) 维向量 \(A=[a_1, a_2 ,...,a_d]\) 与 \(B=[b_1 ,b_2 ,...,b_d]\) 的内积为其相对应维度的权 ...

  9. 「UOJ351」新年的叶子

    「UOJ351」新年的叶子 题目描述 有一棵大小为 \(n\) 的树,每次随机将一个叶子染黑,可以重复染,问期望染多少次后树的直径会缩小. \(1 \leq n \leq 5 \times 10^5\ ...

随机推荐

  1. 错误:error: failed to push some refs to 'https://github.com/pzq7025/KG.git'的解决办法

    一.问题在进行[git push orgin master]的时候出现如下错误 ! [rejected] master -> master (non-fast-forward) error: f ...

  2. Notepad++使用护眼便捷小技巧

    Notepad++是一款很好用的写笔记和代码的应用. 我们可以用它来写博客草稿和日常的笔记.那么,长时间看一个界面,当然会对眼睛有伤害. 所以,一个护眼的背景.是必须的. 下面就是我经常用到的护眼色, ...

  3. WPF 精修篇 属性动画

    原文:WPF 精修篇 属性动画 属性动画 是通过 Storyboard 来改变属性值 <Rectangle x:Name="rect" Width="200&quo ...

  4. 后台数据转换成Excel,前台下载

    <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactI ...

  5. MongoDB下载+安装+配置+错误解决方法

    下载 官网下载: https://www.mongodb.com/download-center/community Server=>Download 安装 下载完成后安装 建议下载根目录(下过 ...

  6. 用友 U9 常用的东西

    系统资源 数据字典 UI组件 UI参照组件 BE组件 BP组件 SV组件

  7. vue中如果在页面中v-model的是字典,那么在定义字典的时候,需要明确定义键值为''或者[],否则给字典的键值赋值后页面不显示

    如题 在template模板中 {{}} {{form_temp.blOwnerMemberList}} #是字典的形式哦 {{}} 在return的属性中 form_temp: { blOwnerM ...

  8. C# 中using 用来释放资源的用法

    using(...) {........} 定义了一个范围,等范围结束以后进行资源的释放. 例如: using(SqlConnection conn = new SqlConnection(" ...

  9. 【转载】Gradle学习 第九章:Groovy快速入门

    转载地址:http://ask.android-studio.org/?/article/17 To build a Groovy project, you use the Groovy plugin ...

  10. Android开发之EditText多行文本输入

    <EditText android:id="@+id/add_content" android:layout_width="fill_parent" an ...