poj1769 线段树优化的dp
附上这道题的链接:http://poj.org/problem?id=1769
题目的意思是有一个装置可以输出n个数的最大值, 这个装置由m个排序器组成, 每个排序器可以将这n个数从s 到 t的数按照从小到大的顺序排列, 有一个人发现将m个排序器中的一些排序器去掉仍然不影响功能, 现在问你最少需要多少个排序器可以完成功能。 我们可以定义dp[i][j]为前i个排序器将第1个数提到j所需要的最少的排序器的数量, 那么当t[i] == j的时候 dp[i][j] = min(dp[i-1][j] , min(dp[i-1][si -- ti]) + 1) 当ti != j的时候 dp[i][j] = dp[i-1][j], 我们观察状态数有m*n个, 显然直接求解会超时, 因此我们考虑使用线段树来优化 见挑战程序设计 p207 , 代码如下:
#include <cstdio> #include <cstring> #include <algorithm>using namespace std; const int maxn = 500000 + 100; const int inf = 0x3f3f3f3f; int n, m;struct segment{int l, r;int x; }seg[3*maxn];void build(int rt, int l, int r) {seg[rt].l = l; seg[rt].r = r;if(l == r) {int value = inf;if(l == 1) value = 0;seg[rt].x = value;return ;}int chl = 2*rt, chr = 2*rt + 1;int mid = (l + r) / 2;build(chl, l, mid);build(chr, mid+1, r);seg[rt].x = min(seg[chl].x, seg[chr].x); }int query(int rt, int l, int r) {if(seg[rt].l == l && seg[rt].r == r) {return seg[rt].x;}int mid = (seg[rt].l + seg[rt].r)/2;if(r <= mid)return query(2*rt, l, r);else if(l > mid)return query(2*rt+1, l, r);else{int v1 = query(2*rt, l, mid);int v2 = query(2*rt+1, mid+1, r);return min(v1, v2);} }void update(int rt, int i, int c) {if(seg[rt].l==seg[rt].r && seg[rt].l == i) {seg[rt].x = c;return ;}int mid = (seg[rt].l + seg[rt].r)/2;if(i <= mid)update(2*rt, i, c);elseupdate(2*rt+1, i, c);seg[rt].x = min(seg[2*rt].x, seg[2*rt+1].x); }int main() {while(scanf("%d%d", &n, &m) != EOF) {build(1, 1, n);for(int i=0; i<m; i++) {int s, t;scanf("%d%d", &s, &t);int v1 = query(1, s, t) + 1;int v2 = query(1, t, t);int v3 = min(v1, v2);update(1, t, v3);}printf("%d\n", query(1, n, n));}return 0; }
转载于:https://www.cnblogs.com/xingxing1024/p/5487428.html
poj1769 线段树优化的dp相关推荐
- HDU3698-Let the light guide us (线段树优化的dp)
Plain of despair was once an ancient battlefield where those brave spirits had rested in peace for t ...
- hdu 4521(线段树优化dp)
小明系列问题--小明序列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Pro ...
- hdu5489 Removed Interval dp+线段树优化
现在看这题居然直接秒了...去年看的时候还以为神题.. 设以第i项为结尾的lis前缀为f[i],以第j项为结尾的lis后缀为g[i],如果求出f[i]和g[j],然后枚举i,快速找到最大的满足a[j] ...
- 埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛H题小Y与多米诺骨牌(线段树优化dp)
题意 题目链接:https://www.nowcoder.com/acm/contest/91/H 来源:牛客网 题解 设l[i]l[i]l[i]为向左推第iii个骨牌最远能影响到的骨牌的编号,r[i ...
- CF 474E Pillars(线段树优化DP)
CF 474E Pillars 题目描述 Marmot found a row with n n n pillars. The i i i -th pillar has the height of h ...
- AtCoder Regular Contest 085 F NRE 线段树优化dp
题意 有长度为n初始全为0的数组A和仅由0和1组成的数组B.现在给出m个区间,每次可以选择某个区间[l,r],使得A数组下标在[l,r]之间的元素变为1.问A和B最小不同位置数量是多少. n,m< ...
- 完美字符子串 单调队列预处理+DP线段树优化
题意:有一个长度为n的字符串,每一位只会是p或j.你需要取出一个子串S(注意不是子序列),使得该子串不管是从左往右还是从右往左取,都保证每时每刻已取出的p的个数不小于j的个数.如果你的子串是最长的,那 ...
- 线段树优化建图详解——区间连边之技巧,吊打紫题之利器
我们从一道例题开始. CF786B Description Solution 朴素解法: 暴力连边+最短路 对于每次连边操作,我们逐一连边,最后在图上跑一遍单源最短路径算法即可. 时间复杂度 O ( ...
- CF786B Legacy(线段树优化建边模板 + 最短路)
整理的算法模板合集: ACM模板 目录 线段树优化建边 题目传送门 由于本题的数据达到了1e5,所以如果直接全部暴力连边的话会达到O(n2)O(n^2)O(n2),时间包括内存都受不了.因此我们需要使 ...
最新文章
- CentOS7(64位)下运行IPython3出错解决办法
- BZOJ 2342 [Shoi2011]双倍回文(manacher+并查集)
- Oracle 12C R2-新特性-转换函数的增强
- vim学习笔记一(环境配置及编译文件)
- java集群session共享_分布式/集群下session共享方案汇总
- kotlin使用spring data jpa(一)
- mysql常规使用(建立,增删改查,视图索引)
- Module build failed: ReferenceError: Unknown plugin module-resolver specified
- 使用FFTW的fftw_plan_dft_c2r_1d()由于未归一化结果错误的解决方案
- 16复变函数的积分(二)
- ubuntu16.04 kinetic 版本ROS安装PR2
- 算法——排序——冒泡排序图解动画
- 计算机网络CRC冗余码的计算
- 阿里副总裁玄难:藏经阁计划研发大规模知识构建技术首次披露
- 跨端框架 RAX 初体验
- 三翼鸟,用两年开启下一个十年
- 弘辽科技:淘宝联盟的推广方式有哪些?
- 基于ArduPilot的旋翼式无人机飞行器开发系列(三,四轴无人机的组成)
- scrapy某家租房信息爬取
- 全志h3通用固件_英菲克i7四核全志H3芯片刷机rom升级固件包
热门文章
- 最酷的windows后门 呵呵
- 第九章 PX4-pixhawk-姿态估计解析
- ARM处理器中“8位位图”
- Codeforces Round #529 (Div. 3) F. Make It Connected(最小生成树)
- [NOTE] SQLite基础及注入相关
- 关于LeTax中图形放置的参数理解
- 运行mysql数据库的命令_mysql 数据库常用命令
- 人工神经网络_图像加载(数据挖掘入门与实践-实验10)
- C语言结构体占用内存总结
- c# mysql varbinary_Mysql中如何插入VarBinary二进制类型?