BZOJ 3193 [JLOI 2013] 计数DP 解题报告
2017-10-25 21:27
295 查看
3193: [JLOI2013]地形生成
Description
最近IK正在做关于地形建模的工作。其中一个工作阶段就是把一些山排列成一行。每座山都有各不相同的标号和高度。为了遵从一些设计上的要求,每座山都设置了一个关键数字,要求对于每座山,比它高且排列在它前面的其它山的数目必须少于它的关键数字。
显然满足要求的排列会有很多个。对于每一个可能的排列,IK生成一个对应的标号序列和等高线序列。标号序列就是按顺序写下每座山的标号。等高线序列就是按顺序写下它们的高度。例如有两座山,这两座山的一个合法排列的第一座山的标号和高度为1和3,而第二座山的标号和高度分别为2和4,那么这个排列的标号序列就是1 2,而等高线序列就是3 4.
现在问题就是,给出所有山的信息,IK希望知道一共有多少种不同的符合条件的标号序列和等高线序列。
Input
输入第一行给出山的个数N。接下来N行每行有两个整数,按照标号从1到N的顺序分别给出一座山的高度和关键数。
Output
输出两个用空格分隔开的数,第一个数是不同的标号序列的个数,第二个数是不同的等高线序列的个数。这两个答案都应该对2011取模,即输出两个答案除以2011取余数的结果
Sample Input
2
1 2
2 2
Sample Output
2 2
HINT
对于所有的数据,有1<=N<=1000,所有的数字都是不大于109的正整数。
【解题报告】
第一问:可以发现对一座山有影响的只可能是比它高的山,所以我们可以将山按高度从大到小排序,依次插入每座山。对于高度相同的山一起处理,按关键值从小到大排序,然后将每座山能插入的位置数乘到答案中,即min(i,a[i].x+1)+num-1,num为它在高度相同的山中的排名。
第二问:为了不重复计算,我们每次将高度相同的山拿出来,然后让插入之后的顺序也不改变。这样就可以DP计算,dp[i][j]=dp[i-1][0]+dp[i-1][1]+……+dp[i-1][j],可以滚动
代码如下:
Description
最近IK正在做关于地形建模的工作。其中一个工作阶段就是把一些山排列成一行。每座山都有各不相同的标号和高度。为了遵从一些设计上的要求,每座山都设置了一个关键数字,要求对于每座山,比它高且排列在它前面的其它山的数目必须少于它的关键数字。
显然满足要求的排列会有很多个。对于每一个可能的排列,IK生成一个对应的标号序列和等高线序列。标号序列就是按顺序写下每座山的标号。等高线序列就是按顺序写下它们的高度。例如有两座山,这两座山的一个合法排列的第一座山的标号和高度为1和3,而第二座山的标号和高度分别为2和4,那么这个排列的标号序列就是1 2,而等高线序列就是3 4.
现在问题就是,给出所有山的信息,IK希望知道一共有多少种不同的符合条件的标号序列和等高线序列。
Input
输入第一行给出山的个数N。接下来N行每行有两个整数,按照标号从1到N的顺序分别给出一座山的高度和关键数。
Output
输出两个用空格分隔开的数,第一个数是不同的标号序列的个数,第二个数是不同的等高线序列的个数。这两个答案都应该对2011取模,即输出两个答案除以2011取余数的结果
Sample Input
2
1 2
2 2
Sample Output
2 2
HINT
对于所有的数据,有1<=N<=1000,所有的数字都是不大于109的正整数。
【解题报告】
第一问:可以发现对一座山有影响的只可能是比它高的山,所以我们可以将山按高度从大到小排序,依次插入每座山。对于高度相同的山一起处理,按关键值从小到大排序,然后将每座山能插入的位置数乘到答案中,即min(i,a[i].x+1)+num-1,num为它在高度相同的山中的排名。
第二问:为了不重复计算,我们每次将高度相同的山拿出来,然后让插入之后的顺序也不改变。这样就可以DP计算,dp[i][j]=dp[i-1][0]+dp[i-1][1]+……+dp[i-1][j],可以滚动
代码如下:
/************************************************************** Problem: 3193 User: onepointo Language: C++ Result: Accepted Time:64 ms Memory:832 kb ****************************************************************/ #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define N 1010 #define mod 2011 struct Data { int h,x; bool friend operator < (Data a,Data b) {return (a.h==b.h)?a.x<b.x:a.h>b.h;} }a ; int dp ; int n,m,ans1=1,ans2=1; int main() { scanf("%d",&n); for(int i=1;i<=n;++i) { scanf("%d%d",&a[i].h,&a[i].x); a[i].x--; } sort(a+1,a+n+1); for(int i=1,t=1;i<=n;i=++t) { while(t<n&&a[t+1].h==a[t].h) t++; memset(dp,0,sizeof(dp));dp[0]=1; for(int j=i;j<=t;++j) { ans1=ans1*(min(i,a[j].x+1)+j-i)%mod; for(int k=1;k<=min(i-1,a[j].x);k++) dp[k]=(dp[k]+dp[k-1])%mod; } int tmp=0; for(int j=0;j<=min(i-1,a[t].x);j++) tmp=(tmp+dp[j])%mod; ans2=ans2*tmp%mod; } printf("%d %d\n",ans1,ans2); return 0; }
相关文章推荐
- BZOJ 3193: [JLOI2013]地形生成【计数dp
- BZOJ 2958: 序列染色 && BZOJ 3193: [JLOI2013]地形生成 —— 肆虐的DP
- [Bzoj3193][JLOI2013]地形生成 (排列组合 + DP)
- 【BZOJ3193】[JLOI2013]地形生成 DP
- BZOJ 3107 [cqoi 2013] DP 解题报告
- BZOJ-3191 卡牌游戏JLOI2013 概率DP
- [bzoj 3193][JLOI2013]地形生成
- BZOJ 1566 DP 解题报告
- BZOJ 1419 DP 解题报告
- [BZOJ1076][SCOI2008]奖励关解题报告|状压DP
- BZOJ 3106 [cqoi 2013] 对抗搜索 解题报告
- 【BZOJ3191】【JLOI2013】卡牌游戏 [DP]
- bzoj 2748 音量调节 DP 解题报告
- BZOJ 1068 [SCOI 2007] 区间DP 解题报告
- BZOJ 3727 PA2014 树DP 解题报告
- BZOJ 1003 DP+最短路 解题报告
- bzoj3193【JLOI2013】地形生成
- BZOJ 4102 [Usaco2015 Open] 图上DP 解题报告
- 【bzoj3193】[JLOI2013]地形生成 dp+组合数学
- BZOJ4033[HAOI2015] 树上染色 解题报告【树上DP】