对于一个  11 到  nn 的排列  p1,p2,⋯,pnp1,p2,⋯,pn ,我们可以轻松地对于任意的  1≤i≤n1≤i≤n 计算出  (li,ri)(li,ri) ,使得对于任意的  1≤L≤R≤n1≤L≤R≤n 来说  min(pL,pL+1,⋯,pR)=pimin(pL,pL+1,⋯,pR)=pi 当且仅当  li≤L≤i≤R≤rili≤L≤i≤R≤ri 。

给定整数  nn 和  (li,ri)(li,ri)   (1≤i≤n)(1≤i≤n) ,你需要计算有多少种可能的  11 到  nn 的排列  p1,p2,⋯,pnp1,p2,⋯,pn 满足上述条件。

由于答案可能很大,你只需要给出答案对  109+7109+7 取模的值。

 

Input每个测试点包含多组测试数据,不超过 5000 组。 
对于每组测试数据: 
第一行包含一个正整数 n ,满足 1 ≤ n ≤ 10^6 。 
第二行包含 n 个正整数 l_1, l_2, ..., l_n ,对于 i = 1, 2, ..., n 满足 1 ≤ l_i ≤ i 。 
第三行包含 n 个正整数 r_1, r_2, ..., r_n ,对于 i = 1, 2, ..., n 满足 i ≤ r_i ≤ n 。 
保证每个测试点的所有测试数据的 n 之和不超过 3*10^6 。 
每个测试点的输入数据不超过 40MiB ,请做好读入优化。Output对于每组测试数据,输出一行"Case #x: y"(不含引号),其中 x 表示测试数据的编号(从 1 开始), y 表示这组数据的答案对 10^9+7 取模的值。Sample Input

3
1 1 3
1 3 3

Sample Output

Case #1: 2

思路:用solve(L,R)表示当前区间的排列方案数,显然最大的一个数贯穿整个区间,不难找到这个最大的数的位置pos,那么把最大的数安置在pos位置处,然后挑选pos-L个数到pos的左边,剩下的到右边,变为solve(L,pos-1)*solve(pos+1,R);

(这里用map来找最大位置。普通的输入优化还是TEL

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int Mod=1e9+;
const int maxn=;
int L[maxn+],pre[maxn+],lat[maxn+];
int fac[maxn+],rev[maxn+],ans,N,Case=; ;
map<pair<int,int>,int >mp;
void read(int &x){
x=; char c=getchar();
while(c>''||c<'') c=getchar();
while(c>=''&&c<='') x=(x<<)+(x<<)+c-'',c=getchar();
}
void solve(int l,int r)
{
if(l>r) return ;
int pos=mp[make_pair(l,r)];
if(pos>r||pos<l){ ans=; return ;}
ans=(ll)ans*fac[r-l]%Mod*rev[pos-l]%Mod*rev[r-pos]%Mod;
solve(l,pos-); solve(pos+,r);
}
int main()
{ fac[]=; for(int i=;i<=maxn;i++) fac[i]=(ll)fac[i-]*i%Mod;
rev[]=; for(int i=;i<=maxn;i++) rev[i]=(ll)(Mod-Mod/i)*rev[Mod%i]%Mod;
rev[]=; for(int i=;i<=maxn;i++) rev[i]=(ll)rev[i-]*rev[i]%Mod;
while(~scanf("%d",&N)){
ans=; mp.clear();
for(int i=;i<=N;i++) read(pre[i]);
for(int i=;i<=N;i++) read(lat[i]);
for(int i=;i<=N;i++) mp[make_pair(pre[i],lat[i])]=i;
solve(,N);
printf("Case #%d: %d\n",++Case,ans);
}
return ;
}

51nod1934:受限制的排列 (分治+组合数)的更多相关文章

  1. 排列组合+组合数取模 HDU 5894

    // 排列组合+组合数取模 HDU 5894 // 题意:n个座位不同,m个人去坐(人是一样的),每个人之间至少相隔k个座位问方案数 // 思路: // 定好m个人 相邻人之间k个座位 剩下就剩n-( ...

  2. 【51nod】1934 受限制的排列

    题解 这题还要判无解真是难受-- 我们发现我们肯定能确定1的位置,1左右的两个区间是同理的可以确定出最小值的位置 我们把区间最小值看成给一个区间+1,构建出笛卡尔树,就求出了每一次取最小值和最小值左右 ...

  3. 洛谷P2606 [ZJOI2010]排列计数(组合数 dp)

    题意 题目链接 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic的,答案 ...

  4. bzoj4517[Sdoi2016]排列计数(组合数,错排)

    4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 1792  Solved: 1111[Submit][Stat ...

  5. 【BZOJ4517】[Sdoi2016]排列计数 组合数+错排

    [BZOJ4517][Sdoi2016]排列计数 Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值 ...

  6. 【bzoj4517】[Sdoi2016]排列计数 组合数+dp

    题目描述 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m 个数是稳定的 满足条 ...

  7. 【BZOJ2111】[ZJOI2010]Perm 排列计数 组合数

    [BZOJ2111][ZJOI2010]Perm 排列计数 Description 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi> ...

  8. 51nod 1934 受限制的排列——笛卡尔树

    题目:http://www.51nod.com/Challenge/Problem.html#!#problemId=1934 根据给出的信息,可以递归地把笛卡尔树建出来.一个点只应该有 0/1/2 ...

  9. 51NOD 1934:受限制的排列——题解

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1934 听说会笛卡尔树的人这题都秒了啊…… 参考:https://blog ...

随机推荐

  1. 【java】spring项目中 对entity进行本类间的克隆

    方法1: [使用spring自带BeanUtils实现克隆] [要求:需要被克隆的类实现Cloneable接口并且重写clone()方法] >例子: >>实体: package co ...

  2. Unable to connect to the MKS : Failed to connect to server XXXXXX:903

    Issue : 通过 vSphere 连接VM控制台的时候, 报错       Unable to connect to the MKS : Failed to connect to server X ...

  3. vue 避免渲染时闪烁

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  4. HashSet中存方用户自己定义数据类型数据,重写equals方法和hashCode方法

    import java.util.Set; import java.util.HashSet; public class SetTest { public static void main(Strin ...

  5. python(40)- 进程、线程、协程及IO模型

    一.操作系统概念 操作系统位于底层硬件与应用软件之间的一层.工作方式:向下管理硬件,向上提供接口. 操作系统进行进程切换:1.出现IO操作:2.固定时间. 固定时间很短,人感受不到.每一个应用层运行起 ...

  6. PCB常用单位转换 mil 英尺

    PCB常用单位转换 mil 英尺 相关常用单位     1mil   = 0.0254mm 100mil = 2.54mm 1英寸   = 1000mil = 2.54cm 1英尺   = 12英寸  ...

  7. vim调试

    首先,想调试一个程序的话,输入以下命令: guest-djjtew@ubuntu:~$ python3 -m pdb 1.py 这时候就停止了,等待着你的输入,然后输入"l"的话, ...

  8. div和img之间的缝隙问题

    这次做的项目,客户说.banner图的上下之间不要留有空隙,细致一看才发现,上下居然都有空隙.审查元素,发现全部的div,img的padding和margin都是0,对于这个间隙到底是假设产生的真的是 ...

  9. 五、WEB框架基础(1)

    框架与架构 Python语言有很多web框架,主要是四个,企业级框架Django,高并发处理框架Tornado,快速开发框架Flask,自定义协议框架Twisted. 全栈网络框架封装了网络通信/线程 ...

  10. 防止ViewPager中的Fragment被销毁

    pager.setOffscreenPageLimit(2); 就可以让ViewPager多缓存一个页面