hdu 5125 magic balls
题意:求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的最大值,这样我们可以通过常数非常小的树状数组来解决。
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 20000
using namespace std; int n,m;
int a[],b[];
int dp[][][];
int c[][];
int f[],cnt; inline int Find(int xx)
{
return lower_bound(f,f+cnt,xx)-f+;
} inline void insert(int *c,int x,int cc)
{
for(; x<=cnt; x+=x&-x)
{
c[x]=max(c[x],cc);
}
} inline int get_max(int *c,int x)
{
int ans=;
for( ; x; x-=x&-x)
{
ans=max(ans,c[x]);
}
return ans;
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{ int n,m;
scanf("%d%d",&n,&m);
cnt=;
for(int i=;i<=n;++i)
{
scanf("%d%d",a+i,b+i);
f[cnt++]=a[i];
f[cnt++]=b[i];
}
sort(f,f+cnt);
cnt=unique(f,f+cnt)-f;
for(int i=;i<=n;++i)
{
a[i]=Find(a[i]);
b[i]=Find(b[i]);
}
memset(c,,sizeof(c));
int ans=;
for(int i=;i<=n;++i)
{
for(int j=;j<=min(m,i);++j)
{
dp[i][j][]=get_max(c[j],a[i]-)+;
ans=max(ans,dp[i][j][]);
if(j)
{
dp[i][j][]=get_max(c[j-],b[i]-)+;
ans=max(ans,dp[i][j][]);
}
}
for(int j=;j<=min(m,i);++j)
{
insert(c[j],a[i],dp[i][j][]);
if(j) insert(c[j],b[i],dp[i][j][]);
}
}
printf("%d\n",ans);
}
return ;
}
hdu 5125 magic balls的更多相关文章
- HDU 5125 magic balls(线段树+DP)
magic balls Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU 1153 magic bitstrings(读题+)
hdu 1153 magic bitstrings 题目大意 一个质数p,现在让你求一个p-1长度的“01魔法串”.关于这个魔法串是这么定义的: 我们现在把这个串经过一段处理变成一个长宽均为p ...
- HDU 4605 Magic Ball Game(可持续化线段树,树状数组,离散化)
Magic Ball Game Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- HDU 2274 Magic WisKey
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2274 Magic WisKey Time Limit: 2000/1000 MS (Java/Othe ...
- hdu 3635 Dragon Balls (带权并查集)
Dragon Balls Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- hdu 4605 Magic Ball Game
http://acm.hdu.edu.cn/showproblem.php?pid=4605 可以离线求解 把所以可能出现的 magic ball 放在一个数组里(去重),从小到大排列 先不考虑特殊 ...
- HDU 4602 Magic Ball Game(离线处理,树状数组,dfs)
Magic Ball Game Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- hdu 3635 Dragon Balls(并查集应用)
Problem Description Five hundred years later, the number of dragon balls will increase unexpectedly, ...
- [搜索] hdu 4016 Magic Bitwise And Operation
主题链接: http://acm.hdu.edu.cn/showproblem.php?pid=4016 Magic Bitwise And Operation Time Limit: 6000/30 ...
随机推荐
- 约瑟夫问题(Josephus Problem)的两种快速递归算法
博文链接:http://haoyuanliu.github.io/2016/04/18/Josephus/ 对,我是来骗访问量的!O(∩_∩)O~~ 约瑟夫问题(Josephus Problem)也称 ...
- IOS多线程的小总结
ios中多线程的实现方案有4种 1.pthread :一套通用的多线程API/适用于Unix\Linux\Windows等系统 (跨平台可移植/使用难度大) C语言 几乎不用 ...
- android market 选择
通过Java包名直接定位到你的App http://market.android.com/details?id=<java包名>或者market://details?id=<java ...
- Delphi系统托盘组件 TTrayIcon 简介
TTrayIcon 的主要属性: TrayIcon.Icon指定托盘图标, 有几种用法:1.设计时选择;2.把一个 TIcon 对象给它;3.使用当前程序图标: TrayIcon1.Icon := A ...
- jni那点事
今天说一下在jni开发中常另新手迷惑的JNIEnv这个东西 比如一个c语言的函数 JNIEXPORT jstring JNICALL Java_com_mmmmar_nativethread_Main ...
- nginix 笔记
1. 一个master进程,多个worker进程,worker进程数目可自动配置为核的数目 2. 配置文件ngnix.conf存放在linux的/etc/ngnix目录下
- Eclipse混淆文件导入Android Studio Gradle编译报input jar file is specified twice
Eclipse项目中的混淆配置文件 复制到AS中 在混淆的过程中提示如下错误 Error:Execution failed for task ':app:proguardDemoRelease ...
- Android(java)学习笔记214:开源框架的文件上传(只能使用Post)
1.文件上传给服务器,服务器端必然要写代码进行支持,如下: 我们新建一个FileUpload.jsp的动态网页,同时我们上传文件只能使用post方式(不可能将上传数据拼凑在url路径下),上传数据Ap ...
- Mediator 中介者 协调者模式
简介 定义:用一个[中介者对象]封装一系列的[对象交互],中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互. 中介者模式的结构 抽象中介者Mediator:定义好[ ...
- 转载:C# 中的委托
原文地址 http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx 感谢博主分享! 引言 委托和 ...