hdu 3564(线段树+LIS)
题意:给出1~n的插入顺序,要求每次插入之后的LIS
解题思路:这道题确实挺难想的,我最开始想用树状数组每插入一个数就更新一次,如果这么想,那么你就输了。它这里的想法是先将1-n的最终位置都保存起来,然后再一个个去找LIS。这里有点离线算法的意思,至少了解到更新时可以先别急着处理。还有这里要总结一种线段树的用法,就是在空格处去填充数字,确实结合了这道题的特点把线段树用的很灵活。。。
参考的博客:http://blog.csdn.net/libin56842/article/details/13095801
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;const int maxn = 100005;
struct Segment
{int l,r;int cnt; //cnt记录空位的数量
}tree[maxn<<2];
int n,len,pos[maxn],ans[maxn],dp[maxn];void build(int rt,int l,int r)
{tree[rt].l = l, tree[rt].r = r;tree[rt].cnt = 1;if(l == r) return;int mid = (l + r) >> 1;build(rt<<1,l,mid);build(rt<<1|1,mid+1,r);tree[rt].cnt = tree[rt<<1].cnt + tree[rt<<1|1].cnt;
}void insert(int rt,int x,int m) //表示m要插入x的位置
{if(tree[rt].l == tree[rt].r){ans[m] = tree[rt].l;tree[rt].cnt = 0;return;}tree[rt].cnt--; //要插入一个数,表示这段区间内有一个空会被占if(x <= tree[rt<<1].cnt)insert(rt<<1,x,m);else insert(rt<<1|1,x-tree[rt<<1].cnt,m);
}int binsearch(int val)
{int l = 1, r = len, mid;while(l <= r){mid = (l + r) >> 1;if(val > dp[mid])l = mid + 1;else r = mid - 1;}return l;
}int main()
{int t,cas = 1;scanf("%d",&t);while(t--){scanf("%d",&n);for(int i = 1; i <= n; i++){scanf("%d",&pos[i]);pos[i]++;dp[i] = 0;}build(1,1,n);for(int i = n; i >= 1; i--) //必须要逆着遍历,因为最后一个加入的数是可以确定位置的,倒数第二个数在最后一个数确定的情况下再找位置,以此类推insert(1,pos[i],i); //也就是说,越往后加入进来的数,它选择位置的权利更大,这是种逆向思维printf("Case #%d:\n",cas++);len = 0;for(int i = 1; i <= n; i++){int k = binsearch(ans[i]);len = max(len,k);dp[k] = ans[i];printf("%d\n",len);}printf("\n");}return 0;
}
hdu 3564(线段树+LIS)相关推荐
- POJ 2777 ZOJ 1610 HDU 1698 --线段树--区间更新
直接将这3题 放一起了 今天在做线段树的东西 这3个都是区间更新的 查询方式互相不同 反正都可以放到一起吧 直接先上链接了 touch me touch me touch me 关于涉及到区间的修改 ...
- hdu 5367(线段树+区间合并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5367 官方题解: 对于求"高山脉"长度,可以利用线段树.树节点中保存左高度连续长度 ...
- hdu 5266(线段树+LCA)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5266 解题思路: 考虑dfs序,通过在简单的证明可知L~R的LCA为L ~R 中dfs序较小的那个位置 ...
- hdu 5124(线段树区间更新+lazy思想)
http://acm.hdu.edu.cn/showproblem.php?pid=5124 题意:区间覆盖次数问题. 解题思路:线段树水之. #include<iostream> #in ...
- HDU - 4578Transformation——线段树+区间加法修改+区间乘法修改+区间置数+区间和查询+区间平方和查询+区间立方和查询
[题目描述] HDU - 4578Transformation Problem Description Yuanfang is puzzled with the question below: The ...
- poj 2777 AND hdu 5316 线段树
区间染色问题,用线段树可以解决.颜色总类不多,故考虑用二进制数的每一位表示一种颜色,然后父节点的颜色就是孩子节点颜色"或"起来,加上lazy标记,轻松AC. poj 2777: 1 ...
- HDU 5238 线段树+数论
原题:http://acm.hdu.edu.cn/showproblem.php?pid=5238. 题解:给你长度为n的操作序列,和m组操作求每组操作的模29393的值.这道题直接显然是没有前途的, ...
- poj 2528 离散化+线段树 hdu 1698 线段树 线段树题目类型一:染色计数 外加离散化
第一次听到离散化是今年省赛的时候,一道矩形并的题,很水,就两个矩形... 今天再去做线段树已经发现离散化忘得差不多了...水逼的悲哀啊... 先看简单点的hdu 1698 http://acm.hdu ...
- HDU 1166(线段树)
线段树 1 #include <cstdio> 2 #include <iostream> 3 using namespace std; 4 #define N 200010 ...
最新文章
- bootstraptable设置行高度_条码打印软件中不干胶卷纸的标签设置方法
- python第三方库有哪些常用的、请列举15个-你想要的Python面试都在这里了【315+道题】...
- 《敏捷企业》作者访谈录
- 哈士奇与阿拉斯加雪橇犬的区别
- 计算机控制系统的概念构成,计算机控制系统复习
- NgRx 里 first 和 take(1) 操作符的区别
- win7系统锁定计算机设置方法
- 【华为云技术分享】云小课 | 迁移第三方云厂商数据至OBS,两种方式任你选
- C语言函数在硬件中的执行原理
- 盒子模型代码_果冻公开课第五课:五分钟理清盒模型的前世今生
- 如何使用 身份证归属地查询API
- windowsXP sp3 升级包
- 虚拟机打不开磁盘或它所依赖的某个快照磁盘
- 专业CDR插件牛为设计大师
- 年轻人,劝你不要做前端
- DeFCN debug记录(训练过程),以及对cvpods框架的分析
- 小微企业实施数字化转型的困境
- r与python的区别和联系-Python和R语言的区别?
- 有IBM Guardium 看清谁动了我的数据
- 牛客网 Wannafly挑战赛20 A-染色
热门文章
- 数字化转型,赋能新零售解决方案介绍
- 神策数据上线“点击分析”,深度感知用户点击行为
- Selenium 基于python 安装以及配置谷歌浏览器启动
- 用vue.js写的一个瀑布流的组件
- 在IIS7上部署aspx网站
- javascript极简时间扩展类
- Daily scrum[2013.11.28]
- Feedback about (Blockchain OR ML) AND (logistics)
- “旧城改造”的背后——银泰新零售阿里云解决方案(上)
- 打通C/4HANA和S/4HANA的一个原型开发:智能服务创新案例