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

出题人语文真好...
各不相同的标号和高度 = 各不相同的标号 + 单独的高度...
第一问比较简单,考虑从大到小插入,在相同情况下,按关键值从小到大插入
这样子,关键大的元素一定会影响到关键小的元素,不会漏统计
插入$i$号元素时,不妨设比它大的数为$S$个,限制为$lim$,和它相同的且已经插入的数有$j$种
那么有$min(S, lim) + j$种插入的方案
第二问也比较简单
考虑$dp$,令$f(i, j)$表示在相同的数中,插入到了$i$,并且$i$插入在第$j$段
由于插入的顺序是不影响答案的,因此,我们可以限制关键值小的必须插在关键值后面
转移时用前缀和转移就行
我们去掉$O(p)$的势能需要$O(p^2)$的时间
而$x_1^2 + x_2^2 ... x_i^2 \leqslant (x_1 + x_2 + ... + x_i)^2$
而序列的势能只有$O(n)$,因此我们的复杂度不会超过$O(n^2)$
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
namespace remoon {
#define re register
#define de double
#define le long double
#define ri register int
#define ll long long
#define sh short
#define pii pair<int, int>
#define mp make_pair
#define pb push_back
#define tpr template <typename ra>
#define rep(iu, st, ed) for(ri iu = st; iu <= ed; iu ++)
#define drep(iu, ed, st) for(ri iu = ed; iu >= st; iu --)
extern inline char gc() {
static char RR[], *S = RR + , *T = RR + ;
if(S == T) fread(RR, , , stdin), S = RR;
return *S ++;
}
inline int read() {
int p = , w = ; char c = gc();
while(c > '' || c < '') { if(c == '-') w = -; c = gc(); }
while(c >= '' && c <= '') p = p * + c - '', c = gc(); return p * w;
}
int wr[], rw;
#define pc(iw) putchar(iw)
tpr inline void write(ra o, char c = '\n') {
if(!o) pc('');
if(o < ) o = -o, pc('-');
while(o) wr[++ rw] = o % , o /= ;
while(rw) pc(wr[rw --] + '');
pc(c);
}
tpr inline void cmin(ra &a, ra b) { if(a > b) a = b; }
tpr inline void cmax(ra &a, ra b) { if(a < b) a = b; }
tpr inline bool ckmin(ra &a, ra b) { return (a > b) ? a = b, : ; }
tpr inline bool ckmax(ra &a, ra b) { return (a < b) ? a = b, : ; }
}
using namespace std;
using namespace remoon; #define sid 1050
#define mod 2011 inline void inc(int &a, int b) { a += b; if(a >= mod) a -= mod; }
inline int mul(int a, int b) { return 1ll * a * b % mod; } int n;
struct mountain {
int h, k;
friend bool operator < (mountain a, mountain b)
{ return a.h > b.h && (a.h == b.h && a.k < b.k); }
} mt[sid]; int f[][];
inline void Solve() {
int ans = ;
for(ri i = , j = ; i <= n; i = j + ) {
j = i; while(mt[j].h == mt[j + ].h) j ++;
rep(ip, i, j) cmin(mt[ip].k, i);
rep(ip, , mt[i].k) f[i][ip] = ;
rep(ip, i, j) {
if(ip < j) rep(jp, , mt[ip + ].k) inc(f[ip][jp], f[ip][jp - ]);
else rep(jp, , mt[ip].k) inc(f[ip][jp], f[ip][jp - ]);
if(ip < j) rep(jp, , mt[ip + ].k) f[ip + ][jp] = f[ip][jp];
}
ans = mul(ans, f[j][mt[j].k]);
}
write(ans);
} int main() { n = read();
rep(i, , n) mt[i].h = read(), mt[i].k = read();
sort(mt + , mt + n + ); int ans = , num, pre;
rep(i, , n) {
if(mt[i].h != mt[i - ].h) pre = i, num = ;
else num ++;
ans = mul(ans, min(pre, mt[i].k) + num);
}
write(ans, ' '); Solve();
return ;
}
luoguP3255 [JLOI2013]地形生成 动态规划的更多相关文章
- 【BZOJ3193】[JLOI2013]地形生成(动态规划)
[BZOJ3193][JLOI2013]地形生成(动态规划) 题面 BZOJ 洛谷 题解 第一问不难,首先按照山的高度从大往小排序,这样子只需要抉择前面有几座山就好了.然而有高度相同的山.其实也不麻烦 ...
- 【BZOJ3193】 [JLOI2013]地形生成
BZOJ3193 [JLOI2013]地形生成 Solution 第一问不是很简单吗? 直接计数就好了. 第二问思考无果看了看hyj神仙的代码,发现可以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 题解: 这种求总排列的题,一种常规做法就是所有的元素 ...
- BZOJ 3193: [JLOI2013]地形生成 计数 + 组合 + 动态规划
第一问: 先不考虑山的高度有相同的:直接按照高度降序排序,试着将每一座山插入到前面山的缝隙中. 当然,这并不代表这些山的相对位置是固定的,因为后面高度更低的山是有机会插入进来的,所以就可以做到将所有情 ...
- [JLOI2013]地形生成
JLOI2013过了好长时间,才写第四题.. 第一问比较好想. 第二问我想到了n^3次方的做法,但是数据....于是没敢写,然后上网查了一下题解,居然是O(n^3)过的,数据这么弱... /* * P ...
- BZOJ3193 [JLOI2013]地形生成 【dp】
题目链接 BZOJ3193 题解 注意\(key\)是小于 第一问,显然按高度降序排序,逐个插入 如果高度各不相同,那么之前插入的都比当前插入的\(i\)大,可插入的位置个数就确定了 由于存在高度相同 ...
- [JLOI2013]地形生成[组合计数]
题意 \(n\) 元素各有一个高度 \(h\) 和关键数字 \(b\) .求有多少个下标序列和高度序列,满足对任意 \(i\),\(j< i\) 且 \(h_j < h_i\)的 \(j\ ...
随机推荐
- MagicB.0—怎样设置电脑自动关机?
天太晚了,该睡觉了,可是你的东西也许正在下载,软件正在更新,总之电脑还有一些工作没有完成,又不需要你人为的守着,随他去吧!可是电脑已经工作了一天了,它也要休息一下,再者也不能浪费电力资源呀,那么就来使 ...
- python学习笔记(十二)之函数
牛刀小试: 定义一个无参函数 >>> def myFirstFunc(): ... print("Hello python") ... print("h ...
- 2017ACM暑期多校联合训练 - Team 2 1003 HDU 6047 Maximum Sequence (线段树)
题目链接 Problem Description Steph is extremely obsessed with "sequence problems" that are usu ...
- Sublime之快捷键(二)
1. 在使用Sublime的时候,经常用到选中文件中相同的一些字段,那怎么办呢? 快捷键: ctrl + d 可以快速的选择,你所选中的文字,每次按下该快捷键,就会自动的寻找相同的字段: Alt + ...
- thinkphp 漂亮的分页样式
---恢复内容开始--- 首先:需要两个文件 page.class.php page.css 1.在TP原有的 page.class.php 文件稍作修改几条代码就可以了, 修改过的地方我会注释, 2 ...
- 深入理解Spring之九:DispatcherServlet初始化源码分析
转载 https://mp.weixin.qq.com/s/UF9s52CBzEDmD0bwMfFw9A DispatcherServlet是SpringMVC的核心分发器,它实现了请求分发,是处理请 ...
- Windows搭建RobotFramework环境(一)
Robot Framework官网 http://robotframework.org/http://robotframework.org/ 安装说明 https://github.com/robot ...
- leetcode 168. Excel Sheet Column Title 171 Excel Sheet Column Number
题目 //像10进制一样进行 转换 只是要从0开始记录 class Solution { public: string convertToTitle(int n) { char a; string ...
- Linux文档时间戳查看和修改——stat
查看文件时间戳命令:stat awk.txtFile: `awk.txt'Size: 20 Blocks: 8 IO Block: 4096 regular fileDevice: 801h/2 ...
- PC端网站跳转手机端网站
<SCRIPT LANGUAGE="JavaScript"> function mobile_device_detect(url) { var thisOS=navig ...