研究一下建树 :

/*
HDU 6044 - Limited Permutation [ 读入优化,笛卡尔树 ] | 2017 Multi-University Training Contest 1
题意:
给出两组序列 l[i], r[i], 代表以 p[i] 为最小值所在的区间的边界
问 满足这些条件的序列 p 的个数
分析:
必定能找到一个p[i] 使得 l[i] == 1, r[i] == n ,其将数组分成两块[1, i-1], [i+1, n]
以之为根节点,将区间为[1, i-1] 和 [i+1, n] 的节点作为左右儿子,再在每一块上递归地进行划分,则构成一棵笛卡尔树
能构成的笛卡尔树的形状是唯一的,若不能构成,则 ans = 0
若能构成,则 以i为根的子树的方案数 f(i) = C(size_l+size_r, size_l) * f(l) * f(r) 数据很多用fread读入
*/
#include <bits/stdc++.h>
using namespace std;
#define LL long long
const int N = 1e6+5;
const LL MOD = 1e9+7;
namespace IO {
const int MX = 4e7; //1e7 占用内存 11000kb
char buf[MX]; int c, sz;
void begin() {
c = 0;
sz = fread(buf, 1, MX, stdin);//一次性全部读入
}
inline bool read(int &t) {
while (c < sz && buf[c] != '-' && (buf[c] < '0' || buf[c] > '9')) c++;
if (c >= sz) return false;//若读完整个缓冲块则退出
bool flag = 0; if(buf[c] == '-') flag = 1, c++;
for(t = 0; c < sz && '0' <= buf[c] && buf[c] <= '9'; c++) t = t * 10 + buf[c] - '0';
if(flag) t = -t;
return true;
}
}
namespace COMB {
int F[N], Finv[N], inv[N];//F是阶乘,Finv是逆元的阶乘
void init(){
inv[1] = 1;
for(int i = 2; i < N; i ++){
inv[i] = (MOD - MOD / i) * 1LL * inv[MOD % i] % MOD;
}
F[0] = Finv[0] = 1;
for(int i = 1; i < N; i ++){
F[i] = F[i-1] * 1LL * i % MOD;
Finv[i] = Finv[i-1] * 1LL * inv[i] % MOD;
}
}
int comb(int n, int m){//comb(n, m)就是C(n, m)
if(m < 0 || m > n) return 0;
return F[n] * 1LL * Finv[n - m] % MOD * Finv[m] % MOD;
}
}
struct Node
{
int f, l, r;
}T[N];
int l[N], r[N];
int n;
int q[N], top;
inline bool cmp(const int& a,const int& b) {
return (r[a] - l[a]) < (r[b] - l[b]);
}
int Build()
{
top = 0;
for (int i = 1; i <= n; i++)
{
int k = top;
while (k && cmp(q[k-1], i)) --k;
if (k != 0)
{
T[i].f = q[k-1];
T[q[k-1]].r = i;
}
if (k != top)
{
T[q[k]].f = i;
T[i].l = q[k];
}
q[k++] = i;
top = k;
}
return q[0];
}
bool flag;
LL ans;
LL dfs(int x, int L, int R)
{
if (!x) return 1;
if (!flag) return 0;
if (l[x] != L || r[x] != R) return 0;
LL res = COMB::comb(R-L, R-x);
res = res * dfs(T[x].l, L, x-1) % MOD;
res = res * dfs(T[x].r, x+1, R) % MOD;
if (res == 0) flag = 0;
return res;
}
int main()
{
COMB::init();
IO::begin();
for (int tt = 1; IO::read(n); ++tt)
{
for (int i = 1; i <= n; i++) T[i].l = T[i].r = T[i].f = 0;
for (int i = 1; i <= n; i++) IO::read(l[i]);
for (int i = 1; i <= n; i++) IO::read(r[i]);
int root = Build();
flag = 1;
ans = dfs(root, 1, n);
printf("Case #%d: %lld\n", tt, ans);
}
}

  要么直接 map

#include <bits/stdc++.h>
using namespace std;
#define LL long long
const int N = 1e6+5;
const LL MOD = 1e9+7;
namespace fastIO {
#define BUF_SIZE 100000
//fread -> read
bool IOerror = 0;
inline char nc() {
static char buf[BUF_SIZE], *p1 = buf + BUF_SIZE, *pend = buf + BUF_SIZE;
if(p1 == pend) {
p1 = buf;
pend = buf + fread(buf, 1, BUF_SIZE, stdin);
if(pend == p1) {
IOerror = 1;
return -1;
}
}
return *p1++;
}
inline bool blank(char ch) {
return ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t';
}
inline void read(int &x) {
char ch;
while(blank(ch = nc()));
if(IOerror)
return;
for(x = ch - '0'; (ch = nc()) >= '0' && ch <= '9'; x = x * 10 + ch - '0');
}
#undef BUF_SIZE
}
namespace COMB {
int F[N], Finv[N], inv[N];//F是阶乘,Finv是逆元的阶乘
void init(){
inv[1] = 1;
for(int i = 2; i < N; i ++){
inv[i] = (MOD - MOD / i) * 1LL * inv[MOD % i] % MOD;
}
F[0] = Finv[0] = 1;
for(int i = 1; i < N; i ++){
F[i] = F[i-1] * 1LL * i % MOD;
Finv[i] = Finv[i-1] * 1LL * inv[i] % MOD;
}
}
int comb(int n, int m){//comb(n, m)就是C(n, m)
if(m < 0 || m > n) return 0;
return F[n] * 1LL * Finv[n - m] % MOD * Finv[m] % MOD;
}
}
typedef pair<int, int> P;
using namespace fastIO;
map<P, int> mp;
int t, n;
int l[N], r[N];
LL dfs(int l, int r)
{
if (l > r) return 1;
int x = mp[P(l, r)];
if (!x) return 0;
LL ans = COMB::comb(r-l, r-x);
ans = ans * dfs(l, x-1) % MOD;
ans = ans * dfs(x+1, r) % MOD;
return ans;
}
int main()
{
COMB::init();
for (int tt = 1; read(n), !IOerror; ++tt)
{
mp.clear();
for (int i = 1; i <= n; i++) read(l[i]);
for (int i = 1; i <= n; i++) read(r[i]);
for (int i = 1; i <= n; i++)
mp[P(l[i], r[i])] = i;
LL ans = dfs(1, n);
printf("Case #%d: %lld\n", tt, ans);
}
}

  

HDU 6044 - Limited Permutation | 2017 Multi-University Training Contest 1的更多相关文章

  1. hdu 6044 : Limited Permutation (2017 多校第一场 1012) 【输入挂 组合数学】

    题目链接 参考博客: http://blog.csdn.net/jinglinxiao/article/details/76165353 http://blog.csdn.net/qq_3175920 ...

  2. HDU 6044 Limited Permutation 读入挂+组合数学

    Limited Permutation Problem Description As to a permutation p1,p2,⋯,pn from 1 to n, it is uncomplica ...

  3. HDU 6044 Limited Permutation(搜索+读入优化)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6044 [题目大意] 给出两个序列li,ri,现在要求构造排列p,使得对于区间[li,ri]来说, ...

  4. HDU 6170 - Two strings | 2017 ZJUT Multi-University Training 9

    /* HDU 6170 - Two strings [ DP ] | 2017 ZJUT Multi-University Training 9 题意: 定义*可以匹配任意长度,.可以匹配任意字符,问 ...

  5. hdu 6301 Distinct Values (2018 Multi-University Training Contest 1 1004)

    Distinct Values Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  6. hdu 5288 OO’s Sequence(2015 Multi-University Training Contest 1)

    OO's Sequence                                                          Time Limit: 4000/2000 MS (Jav ...

  7. hdu 5416 CRB and Tree(2015 Multi-University Training Contest 10)

    CRB and Tree                                                             Time Limit: 8000/4000 MS (J ...

  8. hdu 6315 Naive Operations (2018 Multi-University Training Contest 2 1007)

    Naive Operations Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 502768/502768 K (Java/Other ...

  9. HDU 4944 FSF’s game(2014 Multi-University Training Contest 7)

    思路:  ans[n]=  ans[n-1] + { (n,1),(n,2).....(n,n)}  现在任务 是 计算  { (n,1),(n,2).....(n,n)}(k=n的任意因子) 很明显 ...

随机推荐

  1. linux yum 使用epel源

    由于CentOS6的系统安装了epel-release-latest-7.noarch.rpm 导致在使用yum命令时出现Error: xz compression not available问题. ...

  2. kdress学习

    这两天看了一本书叫<linux二进制分析>,这里面提到的一个小工具kdress,这里分析一下 源码在:https://github.com/elfmaster/kdress kdress介 ...

  3. mysql之存储过程基础

    存储过程 procedure 可以理解为一个处理增删改,没有返回值得函数 创建存储过程的基本语法 create procedure 过程名 ([参数列表]) begin --过程体 end 存储过程主 ...

  4. Hyperledger Fabric-sdk-java

    Hyperledger Fabric-sdk-java 2018年04月18日 23:36:02 l_ricardo 阅读数 975更多 分类专栏: 区块链 java   版权声明:本文为博主原创文章 ...

  5. 【IntelliJ IDEA】快捷键

    1.System.out.println();的快捷方法 sout然后Alt+Enter或者直接点 2.idea上 重写父类方法的快捷键 Ctrl+O之后,在弹出的上面选择要重写的方法 3.idea ...

  6. tomcat 虚拟目录 连接池

  7. 实现a标签按钮完全禁用

    前言 最近在开发时遇见一个问题 我们知道a标签的disabled属性部分浏览器支持,但是尽管设置了disabled属性也无法阻挡任何鼠标经过或是点击事件的,那么如何实现a标签按钮的禁用呢? 转换一下思 ...

  8. H.264 详解

    一.MPEG-4说明 1.VOP视频编码技术 VO(Video Object):视频对象,它是场景中的某个物体,最简单的情况下就是矩形框,它是有生命期的,由时间上连续的许多帧构成. VOP(Video ...

  9. linux mint ubuntu 安装qq

    git clone https://gitee.com/wszqkzqk/deepin-wine-for-ubuntu.gitcd deepin-wine-for-ubuntu./install.sh ...

  10. 使用dockerfile构建nginx镜像 转

      docker构建镜像的方法:   commit.dockerfile 1.使用commit来构建镜像: commit是基于原有镜像基础上构建的镜像,使用此方法构建镜像的目的:保存镜像里的一些配置信 ...