题意:给出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)相关推荐

  1. POJ 2777 ZOJ 1610 HDU 1698 --线段树--区间更新

    直接将这3题 放一起了  今天在做线段树的东西 这3个都是区间更新的 查询方式互相不同 反正都可以放到一起吧 直接先上链接了 touch me touch me touch me 关于涉及到区间的修改 ...

  2. hdu 5367(线段树+区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5367 官方题解: 对于求"高山脉"长度,可以利用线段树.树节点中保存左高度连续长度 ...

  3. hdu 5266(线段树+LCA)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5266 解题思路: 考虑dfs序,通过在简单的证明可知L~R的LCA为L ~R 中dfs序较小的那个位置 ...

  4. hdu 5124(线段树区间更新+lazy思想)

    http://acm.hdu.edu.cn/showproblem.php?pid=5124 题意:区间覆盖次数问题. 解题思路:线段树水之. #include<iostream> #in ...

  5. HDU - 4578Transformation——线段树+区间加法修改+区间乘法修改+区间置数+区间和查询+区间平方和查询+区间立方和查询

    [题目描述] HDU - 4578Transformation Problem Description Yuanfang is puzzled with the question below: The ...

  6. poj 2777 AND hdu 5316 线段树

    区间染色问题,用线段树可以解决.颜色总类不多,故考虑用二进制数的每一位表示一种颜色,然后父节点的颜色就是孩子节点颜色"或"起来,加上lazy标记,轻松AC. poj 2777: 1 ...

  7. HDU 5238 线段树+数论

    原题:http://acm.hdu.edu.cn/showproblem.php?pid=5238. 题解:给你长度为n的操作序列,和m组操作求每组操作的模29393的值.这道题直接显然是没有前途的, ...

  8. poj 2528 离散化+线段树 hdu 1698 线段树 线段树题目类型一:染色计数 外加离散化

    第一次听到离散化是今年省赛的时候,一道矩形并的题,很水,就两个矩形... 今天再去做线段树已经发现离散化忘得差不多了...水逼的悲哀啊... 先看简单点的hdu 1698 http://acm.hdu ...

  9. HDU 1166(线段树)

    线段树 1 #include <cstdio> 2 #include <iostream> 3 using namespace std; 4 #define N 200010 ...

最新文章

  1. bootstraptable设置行高度_条码打印软件中不干胶卷纸的标签设置方法
  2. python第三方库有哪些常用的、请列举15个-你想要的Python面试都在这里了【315+道题】...
  3. 《敏捷企业》作者访谈录
  4. 哈士奇与阿拉斯加雪橇犬的区别
  5. 计算机控制系统的概念构成,计算机控制系统复习
  6. NgRx 里 first 和 take(1) 操作符的区别
  7. win7系统锁定计算机设置方法
  8. 【华为云技术分享】云小课 | 迁移第三方云厂商数据至OBS,两种方式任你选
  9. C语言函数在硬件中的执行原理
  10. 盒子模型代码_果冻公开课第五课:五分钟理清盒模型的前世今生
  11. 如何使用 身份证归属地查询API
  12. windowsXP sp3 升级包
  13. 虚拟机打不开磁盘或它所依赖的某个快照磁盘
  14. 专业CDR插件牛为设计大师
  15. 年轻人,劝你不要做前端
  16. DeFCN debug记录(训练过程),以及对cvpods框架的分析
  17. 小微企业实施数字化转型的困境
  18. r与python的区别和联系-Python和R语言的区别?
  19. 有IBM Guardium 看清谁动了我的数据
  20. 牛客网 Wannafly挑战赛20 A-染色

热门文章

  1. 数字化转型,赋能新零售解决方案介绍
  2. 神策数据上线“点击分析”,深度感知用户点击行为
  3. Selenium 基于python 安装以及配置谷歌浏览器启动
  4. 用vue.js写的一个瀑布流的组件
  5. 在IIS7上部署aspx网站
  6. javascript极简时间扩展类
  7. Daily scrum[2013.11.28]
  8. Feedback about (Blockchain OR ML) AND (logistics)
  9. “旧城改造”的背后——银泰新零售阿里云解决方案(上)
  10. 打通C/4HANA和S/4HANA的一个原型开发:智能服务创新案例