题意:求a数组的LIS,但是加了一个条件,为了LIS最大 b[i] a[i]可以交换。最多交换m次;

思路:我们令dp[i][j][l]表示i在最长上升子序列中,已经损失j点能量,第i个人转换了ai和bi的最长上升子序列的数目,可以得到方程 dp[i][j][0]=max{dp[k][j][0](a[k]<a[i])+1,dp[k][j][1](b[k]<a[i])+1},dp[i][j][1]=max(dp[k][j-1][0](a[k]<b[i])+1,dp[k][j-1][1](b[k]<b[i])+1)。这样是n^2k的,我们换个思路,即从k能转移到哪些i,我们先将体积离散化,再用m颗线段树来维护已损失j点能量的情况下体积为某数的最长上升子序列。这样可以做到nlgnk,不过线段树常数写的很大的话还是会TLE,考虑到求最大值实际上是求1~x的最大值,这样我们可以通过常数非常小的树状数组来解决。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #define maxn 20000
  5. using namespace std;
  6.  
  7. int n,m;
  8. int a[],b[];
  9. int dp[][][];
  10. int c[][];
  11. int f[],cnt;
  12.  
  13. inline int Find(int xx)
  14. {
  15. return lower_bound(f,f+cnt,xx)-f+;
  16. }
  17.  
  18. inline void insert(int *c,int x,int cc)
  19. {
  20. for(; x<=cnt; x+=x&-x)
  21. {
  22. c[x]=max(c[x],cc);
  23. }
  24. }
  25.  
  26. inline int get_max(int *c,int x)
  27. {
  28. int ans=;
  29. for( ; x; x-=x&-x)
  30. {
  31. ans=max(ans,c[x]);
  32. }
  33. return ans;
  34. }
  35.  
  36. int main()
  37. {
  38. int T;
  39. scanf("%d",&T);
  40. while(T--)
  41. {
  42.  
  43. int n,m;
  44. scanf("%d%d",&n,&m);
  45. cnt=;
  46. for(int i=;i<=n;++i)
  47. {
  48. scanf("%d%d",a+i,b+i);
  49. f[cnt++]=a[i];
  50. f[cnt++]=b[i];
  51. }
  52. sort(f,f+cnt);
  53. cnt=unique(f,f+cnt)-f;
  54. for(int i=;i<=n;++i)
  55. {
  56. a[i]=Find(a[i]);
  57. b[i]=Find(b[i]);
  58. }
  59. memset(c,,sizeof(c));
  60. int ans=;
  61. for(int i=;i<=n;++i)
  62. {
  63. for(int j=;j<=min(m,i);++j)
  64. {
  65. dp[i][j][]=get_max(c[j],a[i]-)+;
  66. ans=max(ans,dp[i][j][]);
  67. if(j)
  68. {
  69. dp[i][j][]=get_max(c[j-],b[i]-)+;
  70. ans=max(ans,dp[i][j][]);
  71. }
  72. }
  73. for(int j=;j<=min(m,i);++j)
  74. {
  75. insert(c[j],a[i],dp[i][j][]);
  76. if(j) insert(c[j],b[i],dp[i][j][]);
  77. }
  78. }
  79. printf("%d\n",ans);
  80. }
  81. return ;
  82. }

hdu 5125 magic balls的更多相关文章

  1. HDU 5125 magic balls(线段树+DP)

    magic balls Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  2. HDU 1153 magic bitstrings(读题+)

    hdu 1153 magic bitstrings 题目大意 一个质数p,现在让你求一个p-1长度的“01魔法串”.关于这个魔法串是这么定义的:     我们现在把这个串经过一段处理变成一个长宽均为p ...

  3. HDU 4605 Magic Ball Game(可持续化线段树,树状数组,离散化)

    Magic Ball Game Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  4. HDU 2274 Magic WisKey

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2274 Magic WisKey Time Limit: 2000/1000 MS (Java/Othe ...

  5. hdu 3635 Dragon Balls (带权并查集)

    Dragon Balls Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  6. hdu 4605 Magic Ball Game

    http://acm.hdu.edu.cn/showproblem.php?pid=4605 可以离线求解 把所以可能出现的 magic ball  放在一个数组里(去重),从小到大排列 先不考虑特殊 ...

  7. HDU 4602 Magic Ball Game(离线处理,树状数组,dfs)

    Magic Ball Game Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  8. hdu 3635 Dragon Balls(并查集应用)

    Problem Description Five hundred years later, the number of dragon balls will increase unexpectedly, ...

  9. [搜索] hdu 4016 Magic Bitwise And Operation

    主题链接: http://acm.hdu.edu.cn/showproblem.php?pid=4016 Magic Bitwise And Operation Time Limit: 6000/30 ...

随机推荐

  1. 小菜学习Lucene.Net(更新3.0.3版本使用)

    花了两天的时间研究了下Lucene.Net 发现确实挺好玩.... 最新版本是3.0.3 (最后更新时间2012-10) 可惜3.0.3版本的Lucene.net无法和盘古分词 (最新版为2.3.1. ...

  2. win32程序中简单应用mfc

    今日写程序在win32中用CRect发现报错,突然想起来.要引入mfc库.想重新建立一个工程添加对mfc的支持.发现选项不能选.查资料后发现. 在win32程序中简单应用mfc库,只需要简单的引入&l ...

  3. 数据的存储-NSKeyedArchiver和write to file介绍

    数据的存储-NSKeyedArchiver和write to file介绍 首先介绍各个文件的作用-->讲解文件位置的查找方法-->介绍数据存储的方式:1.使用归档方式存储数据 2.wri ...

  4. 第三篇:数据仓库系统的实现与使用(含OLAP重点讲解)

    前言 上一篇重点讲解了数据仓库建模,它是数据仓库开发中最核心的部分.然而完整的数据仓库系统还会涉及其他一些组件的开发,其中最主要的是ETL工程,在线分析处理工具(OLAP)和商务智能(BI)应用等. ...

  5. codevs 2495 水叮当的舞步IDA*

    /* 比较简单的A* 估价函数很简单就是除了左上角的联通快之外的不同的个数 加上迭代 好像答案最多在16步之内出解 这样裸裸的交上去是50分 在考虑剪枝 每个选颜色的时候一定是选左上角联通快附近的颜色 ...

  6. 使用phpmailer发送邮件(以QQ邮箱为例)

    <?php   include("class/class.phpmailer.php"); //下载phpmailer并include两个文件  include(" ...

  7. 织梦(dedecms)如何清空全部文章和删除后新增文章id号归1的方法

    很多朋友在使用织梦程序做网站的过程中,难免需要添加一些测试文章用于测试网站功能模板等,还有些人朋友网站改版需要变更内容的时候,面对着众多的老文章后总是一筹莫展! 由于织梦后台并不自带一键删除整站文章的 ...

  8. 滑动页面,顶部导航or顶部 固定在一个位置

    现在很多页面 特别是电商用的比较多 比如电商里面某个商品的详细页 往下拉页面 当滚轮到达一定位置的时候  导航栏即固定在顶部 其实他的原理很简单, 就是一开始设置导航为相对定位,然后计算出滚动条离顶部 ...

  9. java中的数据库事务处理

    /*java使用事务处理,首先要求数据库支持事务,如使用MYSQL的事务功能,就要求mysql的表类型为Innodb,*/ /*InnoDB,是MySQL的数据库引擎之一 与传统的ISAM与MyISA ...

  10. SVN设置钩子文件限制提交文件时必须填写更新日志

    进入相应SVN仓库hooks目录,编辑文件pre-commit #!/bin/sh # PRE-COMMIT HOOK## The pre-commit hook is invoked before ...