BZOJ3193 [JLOI2013]地形生成 【dp】
题目链接
题解
注意\(key\)是小于
第一问,显然按高度降序排序,逐个插入
如果高度各不相同,那么之前插入的都比当前插入的\(i\)大,可插入的位置个数就确定了
由于存在高度相同的情况,将key作为第二关键字升序排序
这样后面插入的就一定能插入前面插入的之后,统计一下之前插入了\(cnt\)个相同高度的,可插入的位置就加上\(cnt\)
第二问
如果高度各不相同,答案同第一问
否则要考虑相同高度带来的影响
分段\(dp\)计算每一段相同高度的贡献
我们默认\(key\)大的放在\(key\)小的后面
设\(f[i][j]\)为该段第\(i\)个插入位置\(j\)的方案数
首先\(j\)要在可插入范围内
然后就是
\]
前缀和优化一下就是\(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】的更多相关文章
- 【BZOJ3193】[JLOI2013]地形生成 DP
		[BZOJ3193][JLOI2013]地形生成 Description 最近IK正在做关于地形建模的工作.其中一个工作阶段就是把一些山排列成一行.每座山都有各不相同的标号和高度.为了遵从一些设计上的 ... 
- [Bzoj3193][JLOI2013]地形生成 (排列组合 + DP)
		3193: [JLOI2013]地形生成 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 459 Solved: 223[Submit][Status ... 
- [bzoj3193][JLOI2013]地形生成_排列组合_贪心
		[JLOI2013]地形生成 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3193 题解: 这种求总排列的题,一种常规做法就是所有的元素 ... 
- BZOJ3193: [JLOI2013]地形生成
		传送门 Sol 第一问可以考虑按照山的高度从大到小放 但是这样如果遇到高度相同的就不好考虑,那么同时要求数量限制从小到大 这样每次放的时候后面的一定不会影响前面,并且高度相同的时候前面能放的位置后面的 ... 
- 【BZOJ3193】 [JLOI2013]地形生成
		BZOJ3193 [JLOI2013]地形生成 Solution 第一问不是很简单吗? 直接计数就好了. 第二问思考无果看了看hyj神仙的代码,发现可以dp求解. 具体可以看代码(其实主要是我说不清楚 ... 
- 【BZOJ3193】[JLOI2013]地形生成(动态规划)
		[BZOJ3193][JLOI2013]地形生成(动态规划) 题面 BZOJ 洛谷 题解 第一问不难,首先按照山的高度从大往小排序,这样子只需要抉择前面有几座山就好了.然而有高度相同的山.其实也不麻烦 ... 
- [JLOI2013]地形生成
		JLOI2013过了好长时间,才写第四题.. 第一问比较好想. 第二问我想到了n^3次方的做法,但是数据....于是没敢写,然后上网查了一下题解,居然是O(n^3)过的,数据这么弱... /* * P ... 
- luoguP3255 [JLOI2013]地形生成 动态规划
		出题人语文真好... 各不相同的标号和高度 = 各不相同的标号 + 单独的高度... 第一问比较简单,考虑从大到小插入,在相同情况下,按关键值从小到大插入 这样子,关键大的元素一定会影响到关键小的元素 ... 
- [JLOI2013]地形生成[组合计数]
		题意 \(n\) 元素各有一个高度 \(h\) 和关键数字 \(b\) .求有多少个下标序列和高度序列,满足对任意 \(i\),\(j< i\) 且 \(h_j < h_i\)的 \(j\ ... 
随机推荐
- 20155209林虹宇逆向及Bof基础实验报告
			20155209林虹宇逆向及Bof基础实验报告 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符 ... 
- 20155232《网络对抗》Exp5 MSF基础应用
			20155232<网络对抗>Exp5 MSF基础应用 基础问题回答 用自己的话解释什么是exploit,payload,encode. exploit:就是利用可能存在的漏洞对目标进行攻击 ... 
- 20155234 昝昕明《基于ARM实验箱的国密算法应用》课程设计个人报告
			20155234 昝昕明<基于ARM实验箱的国密算法应用>课程设计个人报告 个人贡献 参与课设题目讨论及完成全过程: 资料收集: SM1算法及和ARM之间通信 负责串口代码调试: 协调完成 ... 
- Linux下的openvpn配置 与 easy-rsa3的证书生成
			#注意:以下操作由服务端操作即可#PS:为什么我找不到var文件??============安装===============wget -O /etc/yum.repos.d/epel.repo ht ... 
- AngularJS + CoffeeScript 前端开发环境配置详解
			AngularJS 号称 '第一框架' ('The first framework') 确实是名不虚传.由其从jQuery中完全转入AngularJS后就有无法离开他的感觉了.虽然AngularJS的 ... 
- LeetCode 3Sum (Two pointers)
			题意 Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all ... 
- Javascript如何实现GPU加速?
			一.什么是Javascript实现GPU加速? CPU与GPU设计目标不同,导致它们之间内部结构差异很大.CPU需要应对通用场景,内部结构非常复杂.而GPU往往面向数据类型统一,且相互无依赖的计算.所 ... 
- 账户控制器(AccountController)
			账户控制器(AccountController) Account控制器提供了登录,注册,忘了密码和电子邮件激活页面功能. Layout模板视图 在Account视图文件夹中单独建设了模板文件: 登录页 ... 
- React半科普文
			React半科普文 什么是React getting started 文件分离 Server端编译 定义一个组件 使用property 组件嵌套 组件更新 Virtual DOM react nati ... 
- mgo like的两种写法
			实际上都是围绕正则来写的,看大家喜欢那种写法 package main import ( "fmt" "labix.org/v2/mgo" "labi ... 
