[JLOI2013]地形生成

题目描述

最近IK正在做关于地形建模的工作。其中一个工作阶段就是把一些山排列成一行。每座山都有各不相同的标号和高度。为了遵从一些设计上的要求,每座山都设置了一个关键数字,要求对于每座山,比它高且排列在它前面的其它山的数目必须少于它的关键数字。 显然满足要求的排列会有很多个。

对于每一个可能的排列,IK生成一个对应的标号序列和等高线序列。标号序列就是按顺序写下每座山的标号。

等高线序列就是按顺序写下它们的高度。例如有两座山,这两座山的一个合法排列的第一座山的标号和高度为1和3,而第二座山的标号和高度分别为2和4,那么这个排列的标号序列就是1 2,而等高线序列就是3 4.

现在问题就是,给出所有山的信息,IK希望知道一共有多少种不同的符合条件的标号序列和等高线序列。

输入输出格式

输入格式:

输入第一行给出山的个数N。接下来N行每行有两个整数,按照标号从1到N的顺序分别给出一座山的高度和关键数

输出格式:

输出两个用空格分隔开的数,第一个数是不同的标号序列的个数,第二个数是不同的等高线序列的个数。这两个答案都应该对2011取模,即输出两个答案除以2011取余数的结果

输入输出样例

输入样例#1:

2
1 2
2 2

输出样例#1:

2 2

说明

对于所有的数据,有1<=N<=1000,所有的数字都是不大于109的正整数。

首先,考虑第一问:满足条件的编号条件

我们发现高度较小的山对高度较大的山是没有影响的

从大到小排序,这样i就只能放在1~min(i-1,k[i])

又考虑可以排在相同的后面

假设i~j相同,对于每一个j

ans1*=(min(i-1,k[i])+j-i+1)

第二问就是说满足条件的高度排列,即存在重复

可以这样想,f[i][k]前i个相同高度排在前k的方案

f[i][j]=f[i-1][j]+f[i-1][j-1]+f[i-1][j-2]+……+f[i-1][1]  (1<=j<=b[i])
f[i][j]=f[i-1][j]+f[i][j-1]

转化为
f[i]+=f[i-1] (1<=i<=b[i])

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<algorithm>
 5 using namespace std;
 6 struct M
 7 {
 8     int h,k;
 9 }a[10001];
10 int n;
11 int ans1=1,ans2=1,f[10001];
12 bool cmp(M x,M y)
13 {
14     return (x.h>y.h||(x.h==y.h&&x.k<y.k));
15 }
16 int main()
17 {int i,j,k,pos;
18     cin>>n;
19     for (i=1;i<=n;i++)
20     {
21      scanf("%d%d",&a[i].h,&a[i].k);
22      a[i].k--;
23     }
24      sort(a+1,a+n+1,cmp);
25      pos=1;
26       for (i=1;i<=n;i=pos+1)
27       {
28          pos=i;
29           while (a[pos].h==a[pos+1].h&&pos<n) pos++;
30           memset(f,0,sizeof(f));
31           f[0]=1;
32           for (j=i;j<=pos;j++)
33           {
34             ans1*=min(a[j].k,i-1)+j-i+1;
35             ans1%=2011;
36              for (k=1;k<=min(a[j].k,i-1);k++)
37              {
38                 f[k]+=f[k-1];
39                 f[k]%=2011;
40              }
41           }
42           int sum=0;
43           for (k=0;k<=i-1,k<=a[pos].k;k++)
44             sum+=f[k],sum%=2011;
45         ans2*=sum;
46         ans2%=2011;
47       }
48 cout<<ans1<<‘ ‘<<ans2<<endl;
49 }
时间: 2024-10-08 20:20:35

[JLOI2013]地形生成的相关文章

BZOJ 3193 JLOI2013 地形生成 组合数学

题目大意:给定一些山,每座山有一个高度和一个关键值,现在要将这些山排成一个序列,要求每座山之前高度高于它的山的数量不能超过它的关键值,求合法的标号序列数和高度序列数 = = 首先我们考虑第一问 我们发现高度较小的山对高度较大的山是没有影响的 那么我们可以将山按照高度从大到小排序 每座山插入时都有一些备选位置 将备选位置数相乘即是答案 现在考虑第二问 嘲讽:谁能告诉我O(n^3)到底怎么做= = 我们按照之前的思路将山按照高度从大到小排序 将高度相同的山拎出来 每一座山都有一些位置可选 那么我们不

luoguP3255 [JLOI2013]地形生成 动态规划

出题人语文真好... 各不相同的标号和高度 = 各不相同的标号 + 单独的高度... 第一问比较简单,考虑从大到小插入,在相同情况下,按关键值从小到大插入 这样子,关键大的元素一定会影响到关键小的元素,不会漏统计 插入$i$号元素时,不妨设比它大的数为$S$个,限制为$lim$,和它相同的且已经插入的数有$j$种 那么有$min(S, lim) + j$种插入的方案 第二问也比较简单 考虑$dp$,令$f(i, j)$表示在相同的数中,插入到了$i$,并且$i$插入在第$j$段 由于插入的顺序是

Day3:关于地形生成

---恢复内容开始--- 今天桃子好像还是没什么动静,不过媳妇倒是有一点见红~ 希望这是马上要出来的前兆了~ 桃子都已经晃点我俩好多回了~ 已经都快习惯来她这个狼来了的征兆了~ -------------------------------任性的分割线--------------------------------- 因为想做一个类似<Minecraft>的游戏,所以各种找关于地形生成的算法~ 虽然之前弄得那个柏林噪音的算法可以,但是欠缺太多东西了~ 不知道是不是我太钻牛角尖了~ 对应该如何制

三维地形生成

三维地形生成的相关代码matlab 1 function terrain() 2 n=9;%递归次数 3 H=2;%设置初始正方形四顶点值 4 t=0.2;%控制地貌形态 5 delta=0.01;%初始随机位移偏移量,控制地貌形态 6 size=2^n+1; 7 S=zeros(size,size);%设置size*size的初始方阵 8 S(1,1)=H+sqrt(1-2^(2*t-2))*normrnd(0,1)*delta;%赋初始高度值 9 S(1,size)=H+sqrt(1-2^(

BZOJ 3193 地形生成

这种dp好烦啊. 懒得写题解. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 1050 #define mod 2011 using namespace std; int n,x,y,f[maxn],ans1=1,ans2=1,l[maxn],r[maxn],cnt=0; struct status { int h,f; frien

关于生成三维地形

本以为<OpenGL游戏编程>中的地形生成算法很高大上,但最近几天因为在看<3D地形编程>,整本书介绍的都是跟地形相关的内容,而<OpenGL游戏编程>中所述地形算法正是最简单的那种,仅仅是<3D地形编程>入门级的算法(硬渲染算法),由LOD.CLOD算法生成的地形是为了渲染大型室外场景的.<OpenGL游戏编程>这本书如今称得上是看明白了,介绍的更多的是OpenGL API和OpenGL程序机制,比较基础,纯粹是堆积木式的开发.总的来说,算法层

unity3d 随机生成地形之随机山脉

利用Fractal Noise生成地形,再加上山体shader,外加雪shader Noise生成结果 noise 生成主要参考这篇文章,就不再赘述 Value3D: Perlin2D: Fractal Noise: 地形生成结果 生成地形网格方法主要参考这篇文章,就不再赘述 noise 频率:22,分辨率:256 Value3D: Perlin2D: Fractal Noise: noise 有很多用处,比如地形,水体,流体,特殊物体的纹理,或使贴图不重复等等 山体shader Shader方

《聚焦3D地形编程》学习点

痞子龙的译本虽然称不上好,但却保留了原汁原味,看这本书时最好结合原文与痞子龙的译文.另外,如果有过地形生成的经验再看这本书时有些帮助,这本书介绍的专业的室外地形开发,很全面的介绍. 仅是个人总结,可能不适合网友阅读. 使用fault formation和midpoint displacement产生不规则地形(程序式生成高度图) burte force(硬渲染)是最慢的地形渲染算法,如果是5*5的高度图,那么将产生5*5个顶点, fault formation+burte force算法=>地形

unity3D绘画手册-----地形及术语解释

Unity3D教程:设置地形(Terrain) Posted on 2013年04月18日 by U3d / Unity3D 基础教程 /被围观 1,901 次 新建地形: 在菜单中新建一个地形. Unity3D教程:设置地形(Terrain) 会看到Terrain对象.如果要修改地形参数,可以在Terrain菜单下的SetResolution中设置. Unity3D教程:设置地形(Terrain) 如上图所示.地形的参数设置: TerrainWidth:全局地形总宽度.其单位为Unity统一单