对于一个  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. Android自己定义ViewGroup打造各种风格的SlidingMenu

    看鸿洋大大的QQ5.0側滑菜单的视频课程,对于側滑的时的动画效果的实现有了新的认识,似乎打通了任督二脉.眼下能够实现随意效果的側滑菜单了.感谢鸿洋大大!! 鸿洋大大用的是HorizontalScrol ...

  2. ssh bitbucket github

    $ ssh-keygen -t rsa -C "mac" $ vi ~/.ssh/config Host bb User git HostName bitbucket.org Id ...

  3. 用 Sencha Touch 构建移动 web 应用程序

    Sencha Touch 是一个使用 HTML5.CSS3 和 JavaScript 语言构建的移动 web 应用程序框架,在本文中,学习如何应用您当前的 web 开发技能进行移动 web 开发.下载 ...

  4. 我的Android进阶之旅------&gt;解决:Execution failed for task &#39;:app:transformResourcesWithMergeJavaResForDebug&#39;.

    错误描写叙述 今天在Android Studio项目中添加了jackson的开发包,编译执行时候.引发了例如以下的错误: Error:Execution failed for task ':app:t ...

  5. Linux基础(3)- 正文处理命令及tar命令、vi编辑器、硬盘分区、格式化及文件系统的管理和软连接、硬连接

    一.正文处理命令及tar命令 1)  将用户信息数据库文件和组信息数据库文件纵向合并为一个文件1.txt(覆盖) 2)  将用户信息数据库文件和用户密码数据库文件纵向合并为一个文件2.txt(追加) ...

  6. CSDN - 进程结束后new出的内存会回收吗?

    http://blog.csdn.net/stanjiang2010/article/details/5386647     关键词:内存回收  

  7. selenium之 chromedriver与chrome版本映射表(更新至v2.29)

    最新的chromedriver与chrome的对应关系表: chromedriver版本 支持的Chrome版本 v2.37 v64-66 v2.36 v63-65 v2.35 v62-64 v2.3 ...

  8. ZYThumbnailTableView---堪比一个小型阅读App

    Demo github地址: https://github.com/liuzhiyi1992/ZYThumbnailTableView 原文地址:http://zyden.vicp.cc/zythum ...

  9. Android对apk源代码的改动--反编译+源代码改动+又一次打包+签名【附HelloWorld的改动实例】

    最近遇到了须要改动apk源代码的问题,于是上网查了下相关资料.编写了HelloWorld进行改动看看可行性,经过实验证明此方案可行,而且后来也成功用这种方法对目标apk进行了改动,仅仅只是须要改动的部 ...

  10. C# winform ListView 的右键菜单的下级菜单的选项视情况禁用方法

    ListView 和右键菜单例如以下图: 要实现功能是: 1.用户状态为[活动]时,改动用户状态为[活动]禁用,反之则反. 2.而且仅仅实用户状态为[非活动]时,[删除学员用户]才是可用状态. 功能非 ...