第一问:

先不考虑山的高度有相同的:直接按照高度降序排序,试着将每一座山插入到前面山的缝隙中.

  • 当然,这并不代表这些山的相对位置是固定的,因为后面高度更低的山是有机会插入进来的,所以就可以做到将所有情况都考虑到.
  • 假设现在要插入第 $i$ 座山,前面已插入了 $i-1$ 座比当前山高的山,那么当前能插入的选择应该是 $min(key_{i},i)$ 种. (既然前面的山都高于第 $i$ 座,所以能且只能插入到这些位置上).
  • 令 $f_{i}$ 表示从大到小插入了 $i$ 座山的方案数,则 $f_{i}=f_{i-1}\times min(key_{i},i)$

现在将高度相同的情况考虑进去:

  • 如果像之前高度不同的做法取做的话高度相同的山会互相牵制.
  • 为了不让这种情况发生,我们令高度相同的第 $i$ 座山的 $key$ 变为 $key+same(i)$,即加上一个在它之前和它高度相同的数量.
  • 然而,这样做的话可能会出现非法情况,即可能会多出来一些.为了不让这种情况出现,我们在排序的时候高度相同的按照关键字从小到大排序.

第二问:

令 $f[i][j]$ 表示相同高度,排完序后编号为 $[l,r]$ 的山中,插进第 $i$ 个,且插入到所有山中 $j$ 位置前的方案数.
$i$ 有两种插入方式:

  1. 插到第 $j$ 座山的前面,则 $i-1$ 也需要插进前 $j$,故 $f[i-1][j]\Rightarrow f[i][j]$.
  2. 插入到前 $j-1$ 座山里面,则直接调用 $f[i][j-1]$ 即可.

综上,$f[i][j]=f[i-1][j]+f[i][j-1]$,可以用滚动数组滚起来.

#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 1009
#define mod 2011
#define ll long long
#define setIO(s) freopen(s".in", "r" , stdin)
using namespace std;
int n ;
struct Node
{
int key, h;
}t[N];
bool cmp(Node a, Node b)
{
return a.h == b.h ? a.key < b.key : a.h > b.h;
}
namespace case1
{
int f[N], key[N], tmp[N];
int main()
{
int i ;
f[0] = 1;
for(i = 1; i <= n ; ++ i)
{
key[i] = t[i].key;
if(t[i].h == t[i - 1].h) key[i] += tmp[i - 1], tmp[i] = tmp[i - 1] + 1;
else tmp[i] = 1;
f[i] = (ll) (f[i - 1] * min(key[i], i)) % mod;
}
printf("%d ", f[n]);
return 0;
}
};
namespace case2
{
int f[N];
int main()
{
int i , j, k, pos, ans = 1;
for(i = 1 ; i <= n ; i = pos + 1)
{
pos = i;
while(pos < n && t[pos + 1].h == t[pos].h) ++ pos;
memset(f, 0, sizeof(f)), f[0] = 1;
for(j = i ; j <= pos ; ++ j)
for(k = 1 ; k <= min(i - 1, t[j].key - 1); ++ k)
f[k] = (f[k] + f[k - 1]) % mod;
int re = 0;
for(j = 0; j <= min(i - 1, t[pos].key - 1) ; ++ j) re = (re + f[j]) % mod;
ans = ans * re % mod;
}
printf("%d\n", ans);
return 0;
}
};
int main()
{
// setIO("input");
int i , j;
scanf("%d", &n);
for(i = 1; i <= n ; ++ i)
scanf("%d%d", &t[i].h, &t[i].key);
sort(t + 1, t + 1 + n, cmp);
case1::main(), case2::main();
return 0;
}

  

BZOJ 3193: [JLOI2013]地形生成 计数 + 组合 + 动态规划的更多相关文章

  1. [Bzoj3193][JLOI2013]地形生成 (排列组合 + DP)

    3193: [JLOI2013]地形生成 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 459  Solved: 223[Submit][Status ...

  2. 【BZOJ3193】[JLOI2013]地形生成(动态规划)

    [BZOJ3193][JLOI2013]地形生成(动态规划) 题面 BZOJ 洛谷 题解 第一问不难,首先按照山的高度从大往小排序,这样子只需要抉择前面有几座山就好了.然而有高度相同的山.其实也不麻烦 ...

  3. [bzoj3193][JLOI2013]地形生成_排列组合_贪心

    [JLOI2013]地形生成 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3193 题解: 这种求总排列的题,一种常规做法就是所有的元素 ...

  4. 【BZOJ3193】 [JLOI2013]地形生成

    BZOJ3193 [JLOI2013]地形生成 Solution 第一问不是很简单吗? 直接计数就好了. 第二问思考无果看了看hyj神仙的代码,发现可以dp求解. 具体可以看代码(其实主要是我说不清楚 ...

  5. 【BZOJ3193】[JLOI2013]地形生成 DP

    [BZOJ3193][JLOI2013]地形生成 Description 最近IK正在做关于地形建模的工作.其中一个工作阶段就是把一些山排列成一行.每座山都有各不相同的标号和高度.为了遵从一些设计上的 ...

  6. [JLOI2013]地形生成[组合计数]

    题意 \(n\) 元素各有一个高度 \(h\) 和关键数字 \(b\) .求有多少个下标序列和高度序列,满足对任意 \(i\),\(j< i\) 且 \(h_j < h_i\)的 \(j\ ...

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

    出题人语文真好... 各不相同的标号和高度 = 各不相同的标号 + 单独的高度... 第一问比较简单,考虑从大到小插入,在相同情况下,按关键值从小到大插入 这样子,关键大的元素一定会影响到关键小的元素 ...

  8. [JLOI2013]地形生成

    JLOI2013过了好长时间,才写第四题.. 第一问比较好想. 第二问我想到了n^3次方的做法,但是数据....于是没敢写,然后上网查了一下题解,居然是O(n^3)过的,数据这么弱... /* * P ...

  9. BZOJ3193 [JLOI2013]地形生成 【dp】

    题目链接 BZOJ3193 题解 注意\(key\)是小于 第一问,显然按高度降序排序,逐个插入 如果高度各不相同,那么之前插入的都比当前插入的\(i\)大,可插入的位置个数就确定了 由于存在高度相同 ...

随机推荐

  1. Axios 的基本使用

    Axios 是一个基于 promise 的HTTP 库, 可以用在浏览器和 node.js 中. 1. 从浏览器创建 XMLHttpRequests 2. 从node.js 创建 http 请求 3. ...

  2. 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 F. Islands

    On the mysterious continent of Tamriel, there is a great empire founded by human. To develope the tr ...

  3. Maven build 命令介绍(转)

    常用命令: 打包:mvn package编译:mvn compile清空:mvn clean(清除编译后目录,默认是target目录)运行测试:mvn test安装jar包到本地仓库中:mvn ins ...

  4. 数据库中的round()

    Round函数返回一个数值,该数值是按照指定的小数位数进行四舍五入运算的结果.可是当保留位跟着的即使是5,有可能进位,也有可能舍去,机会各50%.这样就会造成在应用程序中计算有误. 参数规范 语法 r ...

  5. Inversions After Shuffle CodeForces - 749E (概率,期望)

    大意: 给定一个$n$排列, 随机选一个区间, 求将区间随机重排后整个序列的逆序对期望. 考虑对区间$[l,r]$重排后逆序对的变化, 显然只有区间[l,r]内部会发生改变 而长为$k$的随机排列期望 ...

  6. nginx 针对特定地区的ip进行规则匹配

    使用geoip模块,加载ip库 geoip_country GeoIP.dat; geoip_city GeoLiteCity.dat; 转自http://ju.outofmemory.cn/entr ...

  7. 76. Minimum Window Substring (JAVA)

    Given a string S and a string T, find the minimum window in S which will contain all the characters ...

  8. 对应关系,以及Module作用

    register 8101---10086 gateway 8201---10010 item-service 8301---8081 manage-web 4901---9001 npm start ...

  9. 2019-11-29-win10-uwp-轻量级-MVVM-框架入门-2.1.5.3199

    title author date CreateTime categories win10 uwp 轻量级 MVVM 框架入门 2.1.5.3199 lindexi 2019-11-29 10:16: ...

  10. laravel5.8 表单验证

    'name' => 'required|unique:posts|max:255', // posts 表名 源码  vendor\laravel\framework\src\Illuminat ...