题目链接

BZOJ3193

题解

注意\(key\)是小于

第一问,显然按高度降序排序,逐个插入

如果高度各不相同,那么之前插入的都比当前插入的\(i\)大,可插入的位置个数就确定了

由于存在高度相同的情况,将key作为第二关键字升序排序

这样后面插入的就一定能插入前面插入的之后,统计一下之前插入了\(cnt\)个相同高度的,可插入的位置就加上\(cnt\)

第二问

如果高度各不相同,答案同第一问

否则要考虑相同高度带来的影响

分段\(dp\)计算每一段相同高度的贡献

我们默认\(key\)大的放在\(key\)小的后面

设\(f[i][j]\)为该段第\(i\)个插入位置\(j\)的方案数

首先\(j\)要在可插入范围内

然后就是

\[f[i][j] = \sum\limits_{k = 1}^{j - 1}f[i - 1][k]
\]

前缀和优化一下就是\(O(n^2)\)

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#include<cmath>
#include<map>
#define LL long long int
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define cls(s,v) memset(s,v,sizeof(s))
#define mp(a,b) make_pair<int,int>(a,b)
#define cp pair<int,int>
using namespace std;
const int maxn = 1005,maxm = 100005,INF = 0x3f3f3f3f,P = 2011;
inline int read(){
int out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57){if (c == '-') flag = 0; c = getchar();}
while (c >= 48 && c <= 57){out = (out << 1) + (out << 3) + c - 48; c = getchar();}
return flag ? out : -out;
}
struct node{int h,key;}e[maxn];
inline bool operator <(const node& a,const node& b){
return a.h == b.h ? a.key < b.key : a.h > b.h;
}
int n,f[maxn][maxn],sum[maxn];
void work1(){
int ans = 1,cnt = 0;
for (int i = 1; i <= n; i++,cnt++){
if (i == 1 || e[i].h != e[i - 1].h) cnt = 0;
ans = ans * (min(e[i].key,i - 1 - cnt) + 1 + cnt) % P;
}
printf("%d ",ans);
}
void work2(){
int ans = 1;
for (int i = 1,nxt; i <= n; i = nxt + 1){
nxt = i;
while (nxt < n && e[nxt + 1].h == e[i].h) nxt++;
int E = min(e[i].key,i - 1) + 1;
for (int j = 1; j <= E; j++) f[i][j] = 1;
for (int j = 1; j <= n; j++) sum[j] = (sum[j - 1] + f[i][j]) % P;
for (int u = i + 1; u <= nxt; u++){
int cnt = u - i,E = min(e[u].key,u - 1 - cnt) + 1 + cnt;
for (int j = 1; j <= E; j++){
f[u][j] = 0;
f[u][j] = (f[u][j] + sum[j - 1]) % P;
}
for (int j = 1; j <= n; j++)
sum[j] = (sum[j - 1] + f[u][j]) % P;
}
int tot = 0; E = min(e[nxt].key,nxt - 1 - nxt + i) + 1 + nxt - i;
for (int j = 1; j <= E; j++) tot = (tot + f[nxt][j]) % P;
//printf("mult %d\n",tot);
ans = ans * tot % P;
}
printf("%d\n",ans);
}
int main(){
n = read();
REP(i,n) e[i].h = read(),e[i].key = read() - 1;
sort(e + 1,e + 1 + n);
work1();
work2();
return 0;
}

BZOJ3193 [JLOI2013]地形生成 【dp】的更多相关文章

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

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

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

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

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

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

  4. BZOJ3193: [JLOI2013]地形生成

    传送门 Sol 第一问可以考虑按照山的高度从大到小放 但是这样如果遇到高度相同的就不好考虑,那么同时要求数量限制从小到大 这样每次放的时候后面的一定不会影响前面,并且高度相同的时候前面能放的位置后面的 ...

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

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

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

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

  7. [JLOI2013]地形生成

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

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

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

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

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

随机推荐

  1. [Baltic2013]ballmachine BZOJ3133

    分析: 我们考虑,因为每次放置的时候,都是向子树中含有的编号最小的哪一个走,那么放置的顺序是固定的,我们将边以to的子树最小排序,之后得到的出栈序就是球的放入顺序.目测可以使用堆来实现,线段树也能实现 ...

  2. 2017-2018-4 20155203《网络对抗技术》Exp3 免杀原理与实践

    1.基础问题回答 (1)杀软是如何检测出恶意代码的? 分析恶意程序的行为特征,分析其代码流将其性质归类于恶意代码 (2)免杀是做什么? 使恶意代码避免被查杀,也就是要掩盖恶意代码的特征 (3)免杀的基 ...

  3. #20155232《网络对抗》Exp9 Web安全基础

    20155232<网络对抗>Exp9 Web安全基础 本实践的目标理解常用网络攻击技术的基本原理.Webgoat实践下相关实验. 实验过程 WebGoat Webgoat是OWASP组织研 ...

  4. Kafka查看topic、consumer group状态命令

    最近工作中遇到需要使用kafka的场景,测试消费程序启动后,要莫名的过几十秒乃至几分钟才能成功获取到到topic的partition和offset,而后开始消费数据,于是学习了一下查看kafka br ...

  5. 变量内存空间的释放---c语言

    堆栈内存释放: 栈的内存是由编译器自动分配.释放,出了作用域就释放. 堆的内存由程序员分配.释放,他的作用域是整个程序,如果程序没有释放,程序结束时会自动释放.

  6. 对NP问题的一点感想

    一.概述 回忆欧拉回路问题,要求找出一条经过图的每条边恰好一次的路径,这个问题是线性可解的.哈密尔顿圈问题是找一个简单圈,该圈包括图的每一个顶点.对于这个问题,现在还没有发现线性算法. 对于有向图的单 ...

  7. EditText点击出现光标但不弹出软键盘

    3.0以下版本可以用editText.setInputType(InputType.TYPE_NULL)来实现.或者设置editText.setKeyListener(null)来实现. 3.0以上版 ...

  8. 自制一个H5图片拖拽、裁剪插件(原生JS)

    前言 如今的H5运营活动中,有很多都是让用户拍照或者上传图片,然后对照片加滤镜.加贴纸.评颜值之类的.尤其是一些拍照软件公司的运营活动几乎全部都是这样的. 博主也做过不少,为了省事就封装了一个简单的图 ...

  9. 查看Python的版本、内建方法和模块等内容的方法

    若想更好地应用Python帮助我们解决日常生活的问题,就必须了解清楚它的内建方法和模块等特性.相信不少同学在安装某个版本的Python后,对于内建方法之类都是一知半解,希望本文能帮助了解Python的 ...

  10. 父类与子类this相关问题

    1.SinglyLinkedList: package No3_PolySinglyList; /*实现 带头结点的单链表SinglyLinkedList类*/ public class Singly ...