【JZOJ】 【NOIP2014】【模拟试题】保镖排队
来源:互联网 发布:证券时报数据宝下载. 编辑:程序博客网 时间:2024/04/29 15:58
【模拟试题】保镖排队
Description
【问题背景】
教主LHX作为知名人物,时刻会有恐怖分子威胁他的生命。于是教主雇佣了一些保镖来保障他的人生安全。
【问题描述】
教主一共雇佣了N个保镖,编号为1~N。每个保镖虽然身手敏捷武功高强,但是他在其余N-1个保镖里,都会有一个“上司”,他会对他的上司言听计从。但一号保镖例外,他武功盖世,不惧怕其余任何保镖,所以他没有上司。
教主LHX会对这N个保镖进行定期视察。每次视察的时候,首先会让所有保镖排队。
对于每个保镖,在他心目中会对他的所有下属的武功实力排个队。
现在教主要求排出来的队伍满足:①互为上司-下属的两个保镖,上司在前,下属在后 ②对于一个保镖的所有下属,武功实力较强的在前,较弱的在后。
教主想知道,总的排队方法数除以10007的余数是多少。
Input
输入的第一行为一个正整数T,表示了数据组数。
对于每组数据:
第一行为一个正整数N。
接下来N行,每行描述一个保镖。
第i+1行,会有一个整数K,代表第i个保镖的下属个数,接下来K个数,代表第i个保镖的下属按照武功实力从高到低的编号。
Output
输出包括C行,每行对于每组数据输出方案数mod 10007后的结果。
Sample Input
2
5
2 2 3
2 4 5
0
0
0
7
2 2 3
2 4 5
2 6 7
0
0
0
0
Sample Output
3
10
Hint
【样例解释】
对于第1组数据,有以下3种排列是合法的:
1 2 4 3 5
1 2 3 4 5
1 2 4 5 3
同时满足了1在2与3之前且2在3之前,2在4与5之前且4在5之前
【数据范围】
对于20%的数据,有N ≤ 9;
对于40%的数据,有对于所有K,有K ≤ 2;
对于60%的数据,有N ≤ 100;
对于100%的数据,有T ≤ 10,N ≤ 1000,K ≤ N。
题解
分析题目,不难想到,其实这道题只需要保证当前儿子有序即可,于是就想到从最弱的儿子开始处理,后面的儿子,每一个除了自己必须放在最前面以为,自己的儿子可以随便放。
于是假设当前有tot个格子,然后自己有j个儿子,因为是可放可不放于是就是C(tot+j,j),这个时候你们就会疑惑了,难道不是C(tot+j-1,j)吗,这不是才是可放可不放的公式吗,但你可能忘记了,自己虽然必须放在最前面,但是总的可放位置仍要把他算进去呀。大概说明白了吧,没懂的可以百度一下可放可不放的解释,大概就是这个啦→ x1+x2+......+xtot+1=1,好了不说多了上代码
#include<iostream>#include<iomanip>#include<cstring>#include<cmath>#include<cstdio>#include<algorithm>#include<cstdlib>#include<queue>using namespace std;const int mo=10007;int f[2005][2005],dp[2005],son[2005][2005],num[2005],T,n;int ryl(){char c=getchar();int r=0,z=1;while(c<'0'||c>'9'){if(c=='-')z=-1;c=getchar();}while(c>='0'&&c<='9')r=r*10+c-'0',c=getchar();return r*z;}void get(int x){if(!son[x][0]){dp[x]=1;num[x]=1;return;}int tot=0;dp[x]=1;for(int i=son[x][0];i;i--){get(son[x][i]);tot+=num[son[x][i]];dp[x]=dp[x]%mo*dp[son[x][i]]%mo*f[tot-1][num[son[x][i]]-1]%mo;}num[x]=tot+1;}int main(){f[0][0]=1;for(int i=1;i<=2000;i++){f[i][0]=1;for(int j=1;j<=i;j++)f[i][j]=(f[i-1][j-1]+f[i-1][j])%mo;}T=ryl();while(T--){memset(son,0,sizeof(son));memset(dp,0,sizeof(dp));memset(num,0,sizeof(num));n=ryl();for(int i=1;i<=n;i++){son[i][0]=ryl();for(int j=1;j<=son[i][0];j++)son[i][j]=ryl();}get(1);cout<<dp[1]<<'\n';}return 0;}
- 【JZOJ】 【NOIP2014】【模拟试题】保镖排队
- BSOJ 2927 -- 【模拟试题】保镖排队
- JZOJ NOIP2014模拟 8.12
- JZOJ NOIP2014模拟 8.13
- [jzoj]1794. 保镖排队(树形DP+想法)
- 保镖排队
- Orz教主第6次模拟赛之保镖排队
- jzoj 5000. 【NOI2017模拟3.4】保镖 hall定理+搜索
- jzoj NOIP2014提高组模拟8.9总结
- [JZOJ 3794]. 【NOIP2014模拟8.20】高级打字机
- JZOJ 3808. 【NOIP2014模拟8.25】道路值守
- JZOJ 3807. 【NOIP2014模拟8.25】地砖铺设
- JZOJ 3807. 【NOIP2014模拟8.25】地砖铺设
- JZOJ 3809. 【NOIP2014模拟8.25】设备塔
- JZOJ 3809. 【NOIP2014模拟8.25】设备塔
- JZOJ 3814. 【NOIP2014模拟9.7】天黑黑
- JZOJ 3823. 【NOIP2014模拟9.9】遇见
- JZOJ 3822. 【NOIP2014模拟9.9】逆光
- Android App跳转到应用市场
- 初识JavaCC(一)
- Python_基本概念_简明Python教程_笔记
- 设计模式学习日记。
- O(1)时间检测2的幂次
- 【JZOJ】 【NOIP2014】【模拟试题】保镖排队
- extern关键字详解
- 欢迎使用CSDN-markdown编辑器
- ul横向排版
- oracle11g数据导入导出
- 表格数据分组:Ext.grid.GroupingView
- hdu 5894 分位置(环上组合,16沈阳网络赛)
- 抽象类
- Qt 文件操作1