51nod 1934 受限制的排列——笛卡尔树
题目:http://www.51nod.com/Challenge/Problem.html#!#problemId=1934
根据给出的信息,可以递归地把笛卡尔树建出来。一个点只应该有 0/1/2 个孩子,不然就是无解。
dp[ cr ] 表示把 1~siz[cr] 填进 cr 这个子树的方案数。那么 \( dp[cr]=C_{siz[cr]-1}^{siz[ls]}*dp[ls]*dp[rs] \) 。
注意在各种地方判断无解!如果是 l , cr , r 的话,左孩子应该是 l , ls , cr-1 ,右孩子应该是 cr+1 , rs , r 这样的。
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<set>
- #include<vector>
- #define ls Ls[cr]
- #define rs Rs[cr]
- #define pb push_back
- #define ll long long
- using namespace std;
- int rdn()
- {
- int ret=;bool fx=;char ch=getchar();
- while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
- while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
- return fx?ret:-ret;
- }
- const int N=1e6+,mod=1e9+;
- int pw(int x,int k)
- {int ret=;while(k){if(k&)ret=(ll)ret*x%mod;x=(ll)x*x%mod;k>>=;}return ret;}
- int n,rt,l[N],Ls[N],Rs[N],siz[N],dp[N],jc[N],jcn[N]; bool flag;
- struct Node{
- int r,p;
- Node(int r=,int p=):r(r),p(p) {}
- bool operator< (const Node &b)const
- {return r<b.r;}
- };
- vector<Node> st[N];
- vector<int> vt[N];
- void init()
- {
- int n=1e6;
- jc[]=;for(int i=;i<=n;i++)jc[i]=(ll)jc[i-]*i%mod;
- jcn[n]=pw(jc[n],mod-);
- for(int i=n-;i>=;i--)jcn[i]=(ll)jcn[i+]*(i+)%mod;
- }
- int C(int n,int m)
- {return (ll)jc[n]*jcn[m]%mod*jcn[n-m]%mod;}
- void solve(int L,int R,int cr)
- {
- int tl=L,v,tr;
- vt[cr].clear();//
- if(cr>L)
- {
- if(!l[L]){flag=;return;}
- Node v=st[L][--l[L]]; int bh=v.p;
- if(v.r!=cr-){flag=;return;}
- solve(L,cr-,bh); if(flag)return;
- ls=bh;
- }
- else ls=;
- if(cr<R)
- {
- if(!l[cr+]){flag=;return;}
- Node v=st[cr+][--l[cr+]]; int bh=v.p;
- if(v.r!=R){flag=;return;}
- solve(cr+,R,bh); if(flag)return;
- rs=bh;
- }
- else rs=;
- siz[cr]=siz[ls]+siz[rs]+;
- dp[cr]=(ll)C(siz[cr]-,siz[ls])*dp[ls]%mod*dp[rs]%mod;
- }
- int main()
- {
- int T=; init(); dp[]=;//
- while(scanf("%d",&n)==)
- {
- for(int i=;i<=n;i++)st[i].clear();//
- for(int i=;i<=n;i++)l[i]=rdn();
- for(int i=,r;i<=n;i++)
- {
- r=rdn();st[l[i]].pb(Node(r,i));
- }
- for(int i=;i<=n;i++)
- {
- sort(st[i].begin(),st[i].end());
- l[i]=st[i].size();
- }
- T++; printf("Case #%d: ",T);
- if(!l[])puts("");
- else
- {
- Node rt=st[][--l[]]; int bh=rt.p;
- if(rt.r!=n)puts("");
- else {flag=; solve(,n,bh); printf("%d\n",flag?:dp[bh]);}
- }
- }
- return ;
- }
51nod 1934 受限制的排列——笛卡尔树的更多相关文章
- 【51nod】1934 受限制的排列
题解 这题还要判无解真是难受-- 我们发现我们肯定能确定1的位置,1左右的两个区间是同理的可以确定出最小值的位置 我们把区间最小值看成给一个区间+1,构建出笛卡尔树,就求出了每一次取最小值和最小值左右 ...
- hdu 6305 RMQ Similar Sequence——概率方面的思路+笛卡尔树
题目:http://acm.hdu.edu.cn/showproblem.php?pid=6305 看题解,得知: 0~1内随机取实数,取到两个相同的数的概率是0,所以认为 b 序列是一个排列. 两个 ...
- HDU 1506 Largest Rectangle in a Histogram(单调栈、笛卡尔树)
题意:给定n个连续排列的矩形的高,矩形的宽都为1.问最大矩形覆盖. 例如:n = 7,h[i] = (2 1 4 5 1 3 3),最大覆盖为8. Sample Input 7 2 1 4 5 1 3 ...
- TopCoder 14084 BearPermutations2【笛卡尔树+dp】
传送:https://vjudge.net/problem/TopCoder-14084 只是利用了笛卡尔树的性质,设f[i][j]为区间[i,j]的贡献,然后枚举中间最大的点k来转移,首先是两侧小区 ...
- [TJOI2011]树的序(贪心,笛卡尔树)
[TJOI2011]树的序 题目描述 众所周知,二叉查找树的形态和键值的插入顺序密切相关.准确的讲:1.空树中加入一个键值k,则变为只有一个结点的二叉查找树,此结点的键值即为k:2.在非空树中插入一个 ...
- codevs2178 表达式运算Cuties[笛卡尔树]
2178 表达式运算Cuties 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 大师 Master 题解 查看运行结果 题目描述 Description 给出一个表达 ...
- POJ 2559 Largest Rectangle in a Histogram ——笛卡尔树
[题目分析] 本来是单调栈的题目,用笛卡尔树可以快速的水过去. 把每一个矩阵看成一个二元组(出现的顺序,高度). 然后建造笛卡尔树. 神奇的发现,每一个节点的高度*该子树的大小,就是这一块最大的子矩阵 ...
- NOIP2011pj表达式的值[树形DP 笛卡尔树 | 栈 表达式解析]
题目描述 对于1 位二进制变量定义两种运算: 运算的优先级是: 先计算括号内的,再计算括号外的. “× ”运算优先于“⊕”运算,即计算表达式时,先计算× 运算,再计算⊕运算.例如:计算表达式A⊕B × ...
- POJ 2201 Cartesian Tree ——笛卡尔树
[题目分析] 构造一颗笛卡尔树,然后输出这棵树即可. 首先进行排序,然后用一个栈维护最右的树的节点信息,插入的时候按照第二关键字去找,找到之后插入,下面的树成为它的左子树即可. 然后插入分三种情况讨论 ...
随机推荐
- laravel中的DB facade实现数据的CURD
/* $students=DB::select("select * from student"); var_dump($students);*/ //新增数据: /*$bool=D ...
- bzoj1088 [SCOI2005]扫雷
题解: 首先枚举第一个有木有雷 然后第二个可以通过第一个推,第三个也是 以此类推 最后判断是否合法 代码: #include<bits/stdc++.h> using namespace ...
- docker 部署 flask(二)编写及生成镜像。
简介: 上一篇文章,我们简单的测试了一下服务器环境和docker基础镜像.并没有涉及我们自己编写的flask python程序. 现在,我们就要把我们自己的flask程序,放进docker镜像. 但是 ...
- linux上定时运行scrapy
1 运行方式一 (proxy-ip) [root@192 ~]# cd /data/test-proxy-ip/ (proxy-ip) [root@192 test-proxy-ip]# scrapy ...
- Femtocell家庭基站通信截获、伪造任意短信漏洞
阿里移动安全团队与中国泰尔实验室无线技术部的通信专家们一起,联合对国内运营商某型Femtocell基站进行了安全分析,发现多枚重大漏洞,可导致用户的短信.通话.数据流量被窃听.恶意攻击者可以在免费申领 ...
- Android RIL结构分析与移植
介绍 本文档对Android RIL部分的内容进行了介绍,其重点放在了Android RIL的原生代码部分. 包括四个主题: 1.Android RIL框架介绍 2.Android RIL与 Wind ...
- centos7下Redis-Sentinel安装和配置
一.Redis的安装 1.从官网https://redis.io/download下载最新的stable版本(也可以下载unstable版本)redis-4.0.9.tar.gz. 2.上传到Cent ...
- python @修饰符的几种用法
http://www.360doc.com/content/17/0715/16/10408243_671545922.shtml http://www.cnblogs.com/Egbertbaron ...
- pygame经典sprite精灵类
import cStringIO, base64 import pygame from pygame.locals import * class Ball(pygame.sprite.Sprite): ...
- SWIFT Scan QRCode
SWIFT中扫描QRCode代码如下,照着敲一次再看下API的注释应该就没问题了. import UIKit import Foundation import AVFoundation class V ...