BZOJ 3193: [JLOI2013]地形生成 计数 + 组合 + 动态规划
第一问:
先不考虑山的高度有相同的:直接按照高度降序排序,试着将每一座山插入到前面山的缝隙中.
- 当然,这并不代表这些山的相对位置是固定的,因为后面高度更低的山是有机会插入进来的,所以就可以做到将所有情况都考虑到.
- 假设现在要插入第 $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$ 有两种插入方式:
- 插到第 $j$ 座山的前面,则 $i-1$ 也需要插进前 $j$,故 $f[i-1][j]\Rightarrow f[i][j]$.
- 插入到前 $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]地形生成 计数 + 组合 + 动态规划的更多相关文章
- [Bzoj3193][JLOI2013]地形生成 (排列组合 + DP)
3193: [JLOI2013]地形生成 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 459 Solved: 223[Submit][Status ...
- 【BZOJ3193】[JLOI2013]地形生成(动态规划)
[BZOJ3193][JLOI2013]地形生成(动态规划) 题面 BZOJ 洛谷 题解 第一问不难,首先按照山的高度从大往小排序,这样子只需要抉择前面有几座山就好了.然而有高度相同的山.其实也不麻烦 ...
- [bzoj3193][JLOI2013]地形生成_排列组合_贪心
[JLOI2013]地形生成 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3193 题解: 这种求总排列的题,一种常规做法就是所有的元素 ...
- 【BZOJ3193】 [JLOI2013]地形生成
BZOJ3193 [JLOI2013]地形生成 Solution 第一问不是很简单吗? 直接计数就好了. 第二问思考无果看了看hyj神仙的代码,发现可以dp求解. 具体可以看代码(其实主要是我说不清楚 ...
- 【BZOJ3193】[JLOI2013]地形生成 DP
[BZOJ3193][JLOI2013]地形生成 Description 最近IK正在做关于地形建模的工作.其中一个工作阶段就是把一些山排列成一行.每座山都有各不相同的标号和高度.为了遵从一些设计上的 ...
- [JLOI2013]地形生成[组合计数]
题意 \(n\) 元素各有一个高度 \(h\) 和关键数字 \(b\) .求有多少个下标序列和高度序列,满足对任意 \(i\),\(j< i\) 且 \(h_j < h_i\)的 \(j\ ...
- luoguP3255 [JLOI2013]地形生成 动态规划
出题人语文真好... 各不相同的标号和高度 = 各不相同的标号 + 单独的高度... 第一问比较简单,考虑从大到小插入,在相同情况下,按关键值从小到大插入 这样子,关键大的元素一定会影响到关键小的元素 ...
- [JLOI2013]地形生成
JLOI2013过了好长时间,才写第四题.. 第一问比较好想. 第二问我想到了n^3次方的做法,但是数据....于是没敢写,然后上网查了一下题解,居然是O(n^3)过的,数据这么弱... /* * P ...
- BZOJ3193 [JLOI2013]地形生成 【dp】
题目链接 BZOJ3193 题解 注意\(key\)是小于 第一问,显然按高度降序排序,逐个插入 如果高度各不相同,那么之前插入的都比当前插入的\(i\)大,可插入的位置个数就确定了 由于存在高度相同 ...
随机推荐
- Mybatis--<![CDATA[ sql 语句 ]]>
在mapper文件中写sql语句时,遇到特殊字符时,如:< 等,建议使用<![CDATA[ sql 语句 ]]>标记,将sql语句包裹住,不被解析器解析 在使用mybatis 时 ...
- P4411&&BZOJ1978 [BJWC2010]取数游戏(动态规划dp)
P4411 一道dp f[i]表示一定选第i个数的条件下前i个数所能得到的最优值 last[i]表示质因数i在数列a中最后出现时的下标 状态转移方程为\(f[i]=max\{f[last[j]\:|\ ...
- 使用fiddler 抓包app 网络连接不上的原因
https://blog.csdn.net/m0_37554415/article/details/80434477· 设置完记得关掉fiddler 重启 基于fiddler 4 windown 10 ...
- [转帖]Chrome 错误代码:ERR_UNSAFE_PORT
Chrome 错误代码:ERR_UNSAFE_PORT 2018年07月18日 09:07:50 孤舟听雨 阅读数 182 https://blog.csdn.net/u013043762/artic ...
- vue中Runtime-Compiler和Runtime-only的区别
一.选择Runtime-Compiler和Runtime-only不同模式的时候main.js文件的区别 二.vue程序运行过程 1.解析: 第一步,当把vue模板template传给Vue实例 ...
- 洛谷 P2868 [USACO07DEC]观光奶牛Sightseeing Cows 题解
题面 这道题是一道标准的01分数规划: 但是有一些细节可以优化: 不难想到要二分一个mid然后判定图上是否存在一个环S,该环是否满足∑i=1t(Fun[vi]−mid∗Tim[ei])>0 但是 ...
- py3.7安装Scrapy及安装时的 Running setup.py install for Twisted ... error 和安装后的 Unhandled error in Deferred:
1.首先,win+r 进入cmd,打开命令提示符,输入 pip install scrapy 等待自动安装: 2.到了后半段会出现 Running setup.py install for Tw ...
- transition 带的参数什么意思
过渡transition:属性名 过渡效果时间 时间速度曲线 开始时间 默认值: all 0 e ...
- 啥是IOC ?啥是DI ?
1.IOC是什么? IOC (inverse of controll)控制反转:所谓控制反转就是把创建对象(bean),和维护对象(bean)的关系的权利从程序中转移到spring的容器(appl ...
- Action获取请求参数的3中方式
方式一:Action本身作为Model对象,通过属性注入(Setter)方法讲参数数据封装到Action中 具体为:在Action中,提供和参数名相同的几个属性,并为其提供set方法,那么,该参数会被 ...