【51nod】1934 受限制的排列

题解

这题还要判无解真是难受……

我们发现我们肯定能确定1的位置,1左右的两个区间是同理的可以确定出最小值的位置

我们把区间最小值看成给一个区间+1,构建出笛卡尔树,就求出了每一次取最小值和最小值左右的区间大小
然后就相当于左右子树的排列方式,乘上把左右子树那么多个元素选出左子树个数和右子树个数那么多的方案数,是个普通的组合数

判无解从根开始,要求根的区间是[1,N],左右区间是[1,rt-1][rt + 1,R]递归判下去就好

复杂度\(O(n)\)
但是跑得奇慢无比= =,我脑子一抽把数组改成两倍居然过了。。。卡着时限过的。。。不想写fread(懒.jpg)

代码

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#define enter putchar('\n')
#define space putchar(' ')
#define MAXN 2000005
//#define ivorysi
using namespace std;
typedef long long int64;
template<class T>
void read(T &res) {res = 0;char c = getchar();T f = 1;while(c < '0' || c > '9') {if(c == '-') f = -1;c = getchar();}while(c >= '0' && c <= '9') {res = res * 10 + c - '0';c = getchar();}res *= f;
}
template<class T>
void out(T x) {if(x < 0) {putchar('-');x = -x;}if(x >= 10) {out(x / 10);}putchar('0' + x % 10);
}
const int MOD = 1000000007;int N;
int L[MAXN],R[MAXN],S[MAXN],fac[MAXN],inv[MAXN],invfac[MAXN],lc[MAXN],rc[MAXN],rt;
int sta[MAXN],top;
int inc(int a,int b) {return a + b >= MOD ? a + b - MOD : a + b;
}
int mul(int a,int b) {return 1LL * a * b % MOD;
}
int C(int n,int m) {if(n < m) return 0;return mul(mul(fac[n],invfac[m]),invfac[n - m]);
}
bool check(int u,int fa,int l,int r) {if(!u && l <= r) return false;else if(!u) return true; if(L[u] != l || R[u] != r) return false;if(S[u] == fa + 1) {return check(lc[u],S[u],l,u - 1) && check(rc[u],S[u],u + 1,r);}else return false;
}
int dfs(int u,int L,int R) {if(!u) return 1;return mul(mul(dfs(lc[u],L,u - 1),dfs(rc[u],u + 1,R)),C(R - L,u - L));
}
void Init() {for(int i = 1 ; i <= N ; ++i) {lc[i] = rc[i] = 0;S[i] = 0;read(L[i]);}for(int i = 1 ; i <= N ; ++i) {read(R[i]);S[L[i]]++;S[R[i] + 1]--;}top = 0;int k;for(int i = 1 ; i <= N ; ++i) {S[i] += S[i - 1];if(S[i] == 1) {rt = i;}k = top;while(k >= 1 && S[sta[k]] > S[i]) --k;if(k + 1 <= top) lc[i] = sta[k + 1];if(k) rc[sta[k]] = i;top = k;sta[++top] = i;}
}
void Solve() {if(!check(rt,0,1,N)) {out(0);enter;return;}out(dfs(rt,1,N));enter;
}
int main() {
#ifdef ivorysifreopen("f1.in","r",stdin);
#endifint cnt = 0;fac[0] = 1;for(int i = 1 ; i <= 1000000 ; ++i) fac[i] = mul(fac[i - 1],i);inv[0] = inv[1] = 1;for(int i = 2 ; i <= 1000000 ; ++i) inv[i] = mul(inv[MOD % i],MOD - MOD / i);invfac[0] = 1;for(int i = 1 ; i <= 1000000 ; ++i) invfac[i] = mul(invfac[i - 1],inv[i]);while(scanf("%d",&N) != EOF) {++cnt;printf("Case #%d: ",cnt);Init();Solve();}
}

不能再颓了!还有34天就NOI了!

时间太慢了,但是我又怕它太快了

转载于:https://www.cnblogs.com/ivorysi/p/9175161.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/465733.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

红外感应自动出水水龙头的电路原理

红外感应自动出水的水龙头&#xff0c;生活中很常见&#xff1a;可以用以下的电路方案实现&#xff0c;供电采用USB的5V&#xff1a;只要手靠近“红外线靠近检测模块”&#xff0c;直流水泵就会开启供水&#xff1a;其中这种直流水泵长这样&#xff1a;当“红外线靠近检测模块”…

推荐一些国产开源项目

推荐一些国产开源项目EasyjfEasyjf是一个国产的开源社区&#xff0c;开源项目众多&#xff0c;都做的一般般&#xff0c;但是要支持下&#xff01;http://www.easyjf.com/精仿DZ论坛 LForum 写在前面的话&#xff1a;一 直以来&#xff0c;我都对Web充满了兴趣。曾在04年就开始…

Linux面试最高频的5个基本问题

CPU利用率和CPU负载的区别是什么提到CPU利用率&#xff0c;就必须理解时间片。什么是CPU时间片&#xff1f;我们现在所使用的Windows、Linux、Mac OS都是“多任务操作系统”&#xff0c;就是说他们可以“同时”运行多个程序&#xff0c;比如一边打开Chrome浏览器浏览网页还能一…

用iptables实现G1手机cmwap代理上http网站[转]

2019独角兽企业重金招聘Python工程师标准>>> 折腾了几天&#xff0c;总算有点阶段性成果&#xff1a; 证实可以用iptables实现通过cmwap的代理上HTTP协议的网站。 首先&#xff0c;android系统的实现是有缺陷的。在接入apn中指定的proxy并不会被系统所用。好似只有浏…

equals与==的区别

使用比较原生类型如&#xff1a;boolean、int、char等等&#xff0c;使用equals()比较对象。 1、是判断两个变量或实例是不是指向同一个内存空间。 equals是判断两个变量或实例所指向的内存空间的值是不是相同。 2、是指对内存地址进行比较。 equals()是对字符串的内容进行比较…

初识Buildroot

转自CSDN &#xff0c;记录是为了作者小编学习需要作者&#xff1a;xixihaha331什么是buildrootBuildroot是Linux平台上一个构建嵌入式Linux系统的框架。整个Buildroot是由Makefile脚本和Kconfig配置文件构成的。你可以和编译Linux内核一样&#xff0c;通过buildroot配置&#…

Python3安装(Windows)

Windows下Python3环境搭建 目录 Windows下Python3环境搭建 安装Python 启动终端会话 IDE —— Geany 安装Python 访问https://www.python.org/downloads 点击上图红色区域按钮&#xff0c;下载Python。下载完成后开始安装&#xff1a; 勾选“Add Python 3.7 to PATH”&…

Runtime消息动态解析与转发流程

先上图&#xff1a; 下面根据具体代码看这张图。 一、创建一个Person类&#xff0c; Person.h #import <Foundation/Foundation.h>interface Person : NSObject-(void)sendMessage:(NSString *)message;end Person.m #import "Person.h" #import <objc/runt…

编写优美的GTest测试案例

使用gtest也有很长一段时间了&#xff0c;这期间也积累了一些经验&#xff0c;所以分享一下。GTest为我们提供了便捷的测试框架&#xff0c;让我们只需要关注案例本身。如何在GTest框架下写出优美的测试案例&#xff0c;我觉得必须要做到&#xff1a; 案例的层次结构一定要清晰…

评分9.3,你想要的那本书,来了!

还记得那天晚上我发的朋友圈吗&#xff1f;经过不完全统计&#xff0c;更多的人喜欢C语言这本书&#xff0c;所以这次先安排抽奖这本书籍&#xff0c;属于出版社赞助&#xff0c;也是给大家一个获奖的机会。不吹牛啊&#xff0c;我们办公室一个大神&#xff0c;写算法的&#x…

Python3安装(Linux)

Linux下Python3环境搭建 目录 Linux下Python3环境搭建 检查Python版本&#xff08;ubuntu16.04&#xff09; Helloworld IDE —— Geany 检查Python版本&#xff08;ubuntu16.04&#xff09; Linux默认已经安装了Python。CtrlAltT调出终端&#xff0c;输入python&#xff…

create-react-app 创建react项目 多页面应用

1:npm install -g create-react-app 2:创建一个应用 create-react-app my-app cd my-app 3:提取配置文件 npm run eject 4:允许文件 npm start create-react-app 默认是创建单页面应用&#xff0c;但是也可以创建多页面应用&#xff0c;需要手动配置一下webpack 第一步&…

c语言指针用法详解,通俗易懂超详细!

文章转自&#xff1a;无际单片机大家好&#xff0c;我是无际。今天给大家来讲解一下指针。我会由浅到深&#xff0c;最后结合实际应用讲解&#xff0c;让大家学会指针的同时&#xff0c;知道大佬们都用指针来干嘛&#xff01;长文预警&#xff01;全文大约5200多字&#xff0c;…

DEDE 会员调用方法详解

调用12个企业会员 按 注册时间排序{dede:sql sqlselect * from dede_member where mtype"企业" order by mid limit 0,12}<a href../member/index.php?uid[field:userid/] target_blank>[field:uname/]</a>{/dede:sql}调用12个个人会员 按 注册时间排序…

Python3 —— 变量和简单数据类型

Python3 —— 变量和简单数据类型 目录 python3 —— 变量和简单数据类型 一、变量 1、变量&#xff08;每个变量都存储了一个值——与变量相关联的信息&#xff09; 2、变量命名 二、简单数据类型&#xff08;整型&#xff0c;浮点型&#xff0c;字符串等&#xff09; 1…

Linux C Socket编程,这篇文章让我耳目一新

目录1. 什么是TCP/IP、UDP&#xff1f;2. Socket在哪里呢&#xff1f;3. Socket是什么呢&#xff1f;4. 有很多的框架&#xff0c;为什么还在从Socket开始&#xff1f;5. Linux C Socket简单示例1.什么是TCP/IP、UDP&#xff1f;TCP/IP&#xff08;Transmission Cont…

linux查看杀死进程

linux 中使用top 或 ps 查看进程使用kill杀死进程 1.使用top查看进程&#xff1a; $top 进行执行如上命令即可查看top&#xff01;但是难点在如何以进程的cpu占用量进行排序呢&#xff1f; cpu占用量排序执行下操作&#xff1a; 按大写O再按k再敲回车&#xff0c;然后使用R就可…

视频下载比想象中容易

两周前搞定了56.com的视频独立播放和视频下载后&#xff0c;很得意是吹嘘了一把&#xff0c;有一些朋友也就试着用了&#xff08;有朋友笑称我在为56.com做广告&#xff0c;因为他以前是不知道56.com的&#xff0c;我这么一搞&#xff0c;他竟也喜欢上56.com看视频了&#xff0…

微处理器:50岁了!

编排 | strongerHuang微信公众号 | 嵌入式专栏50年前&#xff08;1971年&#xff09;&#xff0c;英特尔推出了第一款商用的通用型微处理器 4004&#xff0c;4004拥有2300多个晶体管&#xff0c;与当今芯片中的几十上百亿个晶体管相比&#xff0c;这个数字相形见绌&#xff0c;…

Python3 —— 列表

Python3 —— 列表 目录 Python3 —— 列表 1.访问列表元素&#xff08;索引&#xff09; 2.修改列表元素 3.添加列表元素 4.删除列表元素 5.组织列表 6.遍历整个列表&#xff08;for循环&#xff0c;缩进部分都在for范围之内&#xff09; 7.创建数值列表 8.列表简单…